PHP で 'Allowed memory size exhausted' エラーを安全に捕捉する
質問
クライアントに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
.
関連
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
[解決済み】PHPのクラスが見つからないが、インクルードされている
-
phpのAllowed memory size of 134217728 bytes枯渇問題の解決法
-
[解決済み】書き込みコンテキストでメソッドの戻り値を使用することができない
-
[解決済み] Uncaught Error: 未定義の関数 mysql_escape_string() の呼び出し。
-
[解決済み] libapache2-mod-php7 パッケージの場所がわからない
-
[解決済み] $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて
-
[解決済み】Composerのrequireがメモリ不足になる。PHP Fatal error: 許容メモリサイズ1610612736バイトを使い果たしました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Weird PHP error: 'Can't use function return value in write context'.
-
[解決済み】予期せぬ例外。SQLSTATE[HY000] [1045] Access denied for user ****@'localhost' (using password: YES)
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】phpMyAdmin: シークレットパスフレーズ?
-
[解決済み] [Solved] Fatal error: メンバ関数 query() の null への呼び出し。
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開
-
[解決済み] Forbidden :このサーバーの /phpmyadmin にアクセスする権限がありません。