私の質問はどんどん長くなっているので、質問全体を書き直して、より良く、より短くすることにしました。
私は自分のウェブサイトを8GBのメモリを備えた専用サーバーで実行しています。php.ini設定のメモリ制限を上げる必要があることを十分に認識しています。128Mから256M、そして-1に設定しました。それでも問題は持続性です。
致命的なエラー:81行目のD:\ www \ Football \ views \ main.phpのメモリ不足(786432が割り当てられています)(24576バイトを割り当てようとしました)
メモリ不足は、786432バイトのみが割り当てられ、さらに24576バイトが必要であると述べているため、意味がありません。
786432バイトはわずか768キロバイトで、かなり小さいです。
ヒント
- エラーは非常にランダムな行で発生します。行番号81で常にエラーになるとは限りません。
- ピーク時には、Apacheは約500MBのメモリしか使用しません。まだ6GBの余裕があります。
- 無限ループはありません。
- スクリプトは1,042,424バイトかかります。からこの番号を取得する
echo memory_get_peak_usage();
- MySQLからの結果セットは小さいです(最大12行、純粋なテキスト、blobデータなし)
- (重要)2日に1回Apacheを再起動すると、エラーはなくなります。これは通常、Apacheが2日以上実行されている場合に発生します。
- スクリプトのプロファイリングを含めました。ここで入手できます。
- この専用サーバーは、純粋に1つのWebサイトのみを実行するために使用されます。このウェブサイトは、毎分平均1,000人の訪問者がいるトラフィックの多いウェブサイトです。ピーク時には、1,700〜2,000人の訪問者が同時にアクセスします。
サーバー仕様
OS:Windows 2008 R2 64ビット
CPU:Intel Core i5-4コア
RAM:8 GB
Apache 2.2
PHP 5.3.1
ストレージ:2 x 1 TBハードドライブ
帯域幅:1か月あたり10 TB
解決
私はついに問題を調整して修正しました。ここで、改善のために行ったことを共有したいと思います。
favicon.ico
私のルートエンジンを台無しにする行方不明でした。私のルートエンジンは非常に小さいですが、を含めるfavicon.ico
ことで、ルートエンジンを実行しないことで、メモリ使用量を減らすことができます。私のウェブサイトのほとんどはそれを持っていて、私はこの新しいセクションのためにそれを置くのを忘れました。制限
MaxRequestPerChild
が役立ちます。私の他の専用サーバーでは、MaxRequestPerChild
制限があります。このサーバーでは、0に設定しました。各スクリプトは分離されていると常に思っていました。スクリプトの実行に800kbかかる場合を考えてみましょう。完了すると、ApacheまたはPHPは800kbのメモリを解放する必要があります。このようには機能しないようです。Limitedは、Limitedの後に新しいプロセスを作成し、古いプロセスが停止MaxRequestPerChild
することで、メモリリークを防ぐのに役立ちます。MaxRequestPerChild
これが私の新しい設定です。ThreadsPerChild 1500 MaxRequestsPerChild 10000
ob_flush();
わずかに多くのメモリを削減します。それはあまり役に立ちませんが、最適化のあらゆるビットが役立ちます。xdebug
この質問に答えようとする人々によって提案されたように、私はこれまで使用したことがないものを使用しました。私はそれが素晴らしいツールであると言わなければなりません、そして私はそれがわずかに速く動くようにいくつかのものを最適化しました。- いくつかの不要なApacheモジュールを無効にしました。私はそれを一つずつ無効にしようとしています、そして私が別のものを無効にする前にそれが完全に機能することを確認するためにそれを数日間テストしておきます。私は今、すべての不要なPHP拡張機能を無効にしています。
- このサーバーのほとんどのスクリプトは、従来の方法(テンプレートなし、データベースレイヤーなし、純粋なPHP、HTML、およびレガシーmysql_ *関数)を使用していました。正直なところ、それは非常に高速に実行され、非常に小さなメモリを使用しました。ただし、Webサイトが長くなっているため、スクリプトの保守はそれほど簡単ではありません。私はウェブサイトのいくつかの部分を適切なフレームワーク(私自身の小さなフレームワーク)に変換しようとしました。自分のフレームワークを使用した理由は小さいためです(フレームワーク全体で3kbで、必要なものだけが含まれています)。
- この問題を完全に解決するIIS7.5に切り替えます。