ホームページ >バックエンド開発 >PHPチュートリアル >register_shutdown_function および fastcgi_finish_request
phpでは、リクエストが終了しようとしているときに2つのメソッドが実行されます。メソッド名はそれぞれ register_shutdown_function と fastcgi_finish_request です。実行のタイミングは似ていますが、機能とアプリケーションのシナリオは異なります。 2 つの方法の違いを比較することは、この記事の焦点ではありません。この記事の焦点は、2 つの方法の適用シナリオを説明することです。
機能:
リクエストリクエストが実行されると、登録されたメソッドが呼び出されます。実行中にエラーが発生し、このリクエストが強制終了された場合でも、登録されたメソッドは引き続き実行されることに注意してください。
アプリケーション シナリオ 1:
その機能を使用して、いくつかのエラーの詳細情報を取得できます。サンプルコードは次のとおりです。
<span>function</span><span> catch_error(){ </span><span>$error</span> =<span> error_get_last(); </span><span>if</span>(<span>$error</span><span>){ </span><span>var_dump</span>(<span>$error</span><span>); } } </span><span>register_shutdown_function</span>("catch_error"<span>); </span><span>ini_set</span>('memory_limit','1M'<span>); </span><span>$content</span> = <span>str_repeat</span>("aaaaaaaaaaaaaaaaaaaaaaa",100000<span>); </span><span>echo</span> "aa";
出力情報は次のとおりです。
array(4) { ["type"]=> int(1) ["message"]=> ) "許可されたメモリ サイズ 1048576 バイトが使い果たされました (2300001 バイトを割り当てようとしました)" ["file"]=> string(39) "/test.php" ["line"]=> int(13) }
ご覧のとおり、上記のコードはメモリ不足エラーを正常にキャッチします。
アプリケーションシナリオ 2
リクエストが正常にクローズされたかどうかを確認します。サンプルコードは以下のとおりです。
<span>function</span><span> monitor(){ </span><span>global</span><span>$is_end</span><span>; </span><span>if</span>(<span>$is_end</span> == <span>true</span><span>){ </span><span>echo</span> "success"<span>; }</span><span>else</span><span>{ </span><span>echo</span> "fail"<span>; } } </span><span>register_shutdown_function</span>("monitor"<span>); </span><span>$is_end</span> = <span>false</span><span>; </span><span>die</span><span>(); </span><span>$is_end</span> = <span>true</span>;
ページの出力結果は、fail
die 関数を呼び出しても表示されます。登録した監視機能も正常に実行されます。
機能:
データをクライアントにフラッシュします。このメソッドを呼び出した後は、出力内容はクライアントに出力されません。
アプリケーションシナリオ:
リクエストの処理内容の一部をクライアントに送信する必要がない場合は、まずクライアントに出力する内容を生成してから、このメソッドを呼び出すことができます。メソッドが呼び出された後、コンテンツがクライアントに出力されます。クライアントに出力する必要のないコンテンツは、このメソッドの後に配置できます。これにより応答性が向上します。サンプルコードは以下の通りです。
<span>echo</span> "a"<span>; fastcgi_finish_request(); </span><span>echo</span> "b"<span>; </span><span>file_put_contents</span>("/tmp/test","abc.com"<span>); </span><span>die</span><span>(); </span><span>file_put_contents</span>("/tmp/test2","测试数据");
ページの出力結果は、 a
fastcgi_finish_request メソッド後の echo "b" がクライアントに出力されていないことがわかります。ただし、ファイルは /tmp/test ディレクトリに通常どおり作成されていることがわかります。しかし、/tmp/bo56 ファイルは作成されませんでした
上記では、register_shutdown_function と fastcgi_finish_request を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。