1. ホーム
  2. php

PHP で 'Allowed memory size exhausted' エラーを安全に捕捉する

2023-09-11 23:20:23

質問

クライアントにJSONを返すゲートウェイスクリプトを持っています。 このスクリプトでは set_error_handler を使用して、エラーをキャッチし、なおかつフォーマットされたリターンを持っています。

許容メモリサイズを使い果たしました'というエラーが発生しますが、 メモリの制限を増やすよりも、例えば ini_set('memory_limit', '19T') のようにします。 のようにメモリ制限を増やすのではなく、「メモリを使いすぎたので、他のものを試してください」と返したいだけなのです。

致命的なエラーをキャッチするための良い方法はありますか?

どのように解決するのですか?

として この回答 が示唆するように register_shutdown_function() をチェックするコールバックを登録します。 error_get_last() .

によるものであれ、問題のあるコードから生成された出力を管理しなければならないことに変わりはありません。 @ ( を閉じます。 ) 演算子、または ini_set('display_errors', false)

ini_set('display_errors', false);

error_reporting(-1);

set_error_handler(function($code, $string, $file, $line){
        throw new ErrorException($string, null, $code, $file, $line);
    });

register_shutdown_function(function(){
        $error = error_get_last();
        if(null !== $error)
        {
            echo 'Caught at shutdown';
        }
    });

try
{
    while(true)
    {
        $data .= str_repeat('#', PHP_INT_MAX);
    }
}
catch(\Exception $exception)
{
    echo 'Caught in try/catch';
}

実行すると、次のように出力されます。 Caught at shutdown . 残念ながら ErrorException 例外オブジェクトはスローされません。致命的なエラーはスクリプトの終了を引き起こし、その後 shutdown 関数でのみ捕捉されるからです。

を確認することができます。 $error の配列をチェックし、それに応じて対応します。一つの提案は、ウェブアプリケーションに対してリクエストを再発行することです ( を別のアドレスで、あるいはもちろん別のパラメータで発行することです。 ) を発行し、キャプチャしたレスポンスを返すことです。

私は error_reporting() を高く保つことをお勧めします ( の値は -1 ) を使っていますが、( を使用すると、他の人が提案したように ) のエラーハンドリングを使って、他のすべての set_error_handler()ErrorException .