dedecms を実行すると、一部のページで「致命的エラー: 許可されたメモリ サイズ 134217728 バイトが枯渇する」というエラーが表示されることに気づく人もいます。この問題の解決方法を見てみましょう。
エラー メッセージ: 致命的エラー: 許容メモリ サイズ 134217728 バイトが使い果たされました (38218371 バイトを割り当てようとしました) ....
解決策:
1. PHPのメモリ制限を解除します。
PHPプログラムにini_set("memory_limit","-1");
を追加
2. 必要に応じて PHP のメモリ制限を変更し、マシンのメモリ サイズを参照します (1024M に変更するなど)。
php プログラムに ini_set("memory_limit","1024M"); を追加するか、php.ini 内の対応する場所をmemory_limit = 1024M;
メモリ制限の意味
PHP の関連ドキュメントでは、memory_limit について次のように説明されています:
memory_limit: 整数
このコマンドは、スクリプトが適用できるメモリの最大バイト数を設定します。これは、不適切に書かれたスクリプトがサーバー上の使用可能なメモリを使い果たすことを防ぐのに役立ちます。このディレクティブを使用するには、コンパイル時に有効にする必要があります。したがって、configure 行には --enable-memory-limit を含める必要があります。メモリ制限が必要ない場合は、-1 に設定する必要があります。 php 4.3.2 以降では、memory_limit が有効になっている場合、PHP 関数memory_get_usage() が使用できるようになります。つまり、ページ内の PHP 処理のメモリ制限は、デフォルト (/etc/php.ini) で 128M と定義されています (システムのデフォルトのインストール後)。その後、開発チームのアプリケーションはますます複雑になりました。構造上の欠陥がいくつかある可能性があり、オブジェクト要求が頻繁に発生すると実際にはメモリ不足が発生します。
アプリケーションレベルのテストとソリューション
最善の方法は、メモリ設定を継続的に増やすのではなく、アプリケーション レベルで解決する必要があります。以下はコードテストです:
コードは次のとおりです | コードをコピー |
|
実行結果は次のように表示されます:
合計実行時間: 1.47 秒
メモリ使用量: 77.09 M
1 ページには実際に 7,700 万件のリクエストがあります。その理由は、コーディングの際、プログラマは変数に値を代入するだけで、設定を解除 ($var) しないためです。想像してみてください。ページ リクエストで 20 個の SQL クエリを処理する必要がある場合、各 SQL クエリは 10 個の SQL 結果を返します。プログラマは、行のすべての列を返すか、必要な列だけを返すかを気にしません (実際には、さらに多くの SQL クエリを使用する場合)。 common 中間層が使用される場合、NHibernate や JBOSS などの ORM と同様に、特定のフィールドではなくすべての列が返されることが多く、行に 10K がある場合、処理の終了までにページは 10K に増加します。 10*20=2M の配列割り当て。最も多くの配列をコピーする必要がある回数はカウントしません。
そのため、PHP では、メモリ リソースを最大限に節約するために、使用後に変数を unset($var) するのが合理的な方法です。
経験から語る
apaceh2.3 と php5.2.6 を使用しているサーバーがあります。上記の方法は php バージョンのバグであることが公式に確認されており、それを上位のバージョンに変更して使用することができます。それを解決してください。