最近、ホスト上で wordpress プラグインを使用しているときにエラーが頻繁に発生するという話を聞きました。php の display_error 関数をオンにすると、「致命的なエラー: 許容メモリ サイズは次のとおりです。」と報告されることがわかりました。 35389440 バイトが使い果たされました" (1406507 バイトを割り当てようとしました) in xxxxxx on line xxx"。これは、致命的なエラーとメモリが使い果たされていることを意味します。 Googleで検索すると、インターネット上にこのような質問がたくさんあり、答えはすべて同じです phpのメモリ制限を変更し、php.iniのmemory_limitをより大きな値に変更します。
しかし、ここで大きな問題が発生します。PHP がアクセスできるメモリ サイズは 35389440 バイトですが、実際に割り当てられるのは 1406507 バイトだけです。実際にアクセスが許可されているメモリよりも小さいメモリを割り当てると、致命的なエラーが発生するのはなぜですか?
この領域の多くの情報を確認したところ、検索結果の多くは実際に割り当てられるメモリが許容メモリよりも少ないことを示していることがわかりましたが、これについての説明はありませんが見つかりました。
まず、PHP 自体のメモリ制限機能にバグがあるのではないかと考え、次のような実験をしてみました。
1, 10MB のファイルを生成 dd if =/dev/zero of =10mb bs=1M count=10
2、次の php ファイルを生成してアクセスします:
<?phpini_set("memory_limit","2M");echo file_get_contents("./10mb");?>
エラー「致命的エラー:」が見つかりました。許可されたメモリ サイズ 2097152 バイトが使い果たされました (10493952 バイトを割り当てようとしました)」というエラーは、設定した 2M メモリ制限と同じですが、実際の割り当ては 10M です。これは、メモリリミットの機能自体には問題がなく、エラーデータと実際のデータが一致していることを示しています。
それでは、上記の問題はどこにあるのでしょうか?実際に割り当てられたメモリが制限されたメモリより小さく、エラーが発生するのはなぜですか?また、memory_limit に関する PHP の指示も確認しました。
これは、スクリプトが割り当てられる最大メモリ量をバイト単位で設定します。これは、不適切に作成されたスクリプトがサーバー上の利用可能なメモリをすべて使い果たすことを防ぐのに役立ちます。メモリ制限がない場合は、このディレクティブを -1 に設定してください。
上記の問題については説明がありません。単に、スクリプト内で割り当てられるメモリ サイズを制限してサーバーを保護するために、memory_limit が使用されていることがわかります。書かれた脚本の影響。つまり、memory_limit は、単一の PHP 実行スクリプトでアクセス可能なメモリ サイズを制限します。スレッド全体の複数の操作を合わせたメモリが合計制限サイズを超える可能性がありますが、単一の操作のメモリはそれのみを占めます。制限全体のごく一部であり、ラクダの背中を折った最後の藁は、PHP によって報告されたエラーでした。つまり、アクセスしようとしたメモリ サイズが制限よりも小さいことが示されました。この推測を検証するために、上記の PHP ファイルを次のように変更して
<?phpini_set("memory_limit","15M");$a = file_get_contents("./10mb");$b = file_get_contents("./10mb");?>
にアクセスすると、「致命的なエラー: 許容メモリ サイズ 15728640 バイトが使い果たされました (10493952 を割り当てようとしました)」というエラーが見つかりました。 bytes)" の場合、実際に割り当てられるメモリは 10M で、アクセスが許可されている 15M よりも少なく、前の推測が検証されます。つまり、プログラムの実行時に設定されたメモリを超えた場合、PHP エラー メッセージは、現在の操作がアクセスしようとしているメモリ サイズのみを要求します。
次に、メモリ制限のサイズを直接増やすことで、この問題を解決できます。制限のサイズは、Web サイトのメモリ消費量をカウントするために PHP の shutdown 関数にmemory_get_usage 関数を登録することで計算できます。適切な値を取ります。
メモリ制限