ホームページ >バックエンド開発 >PHPチュートリアル >register_shutdown_function および fastcgi_finish_request

register_shutdown_function および fastcgi_finish_request

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-07-29 09:04:201104ブラウズ

phpでは、リクエストが終了しようとしているときに2つのメソッドが実行されます。メソッド名はそれぞれ register_shutdown_function と fastcgi_finish_request です。実行のタイミングは似ていますが、機能とアプリケーションのシナリオは異なります。 2 つの方法の違いを比較することは、この記事の焦点では​​ありません。この記事の焦点は、2 つの方法の適用シナリオを説明することです。

register_shutdown_function

機能:

リクエストリクエストが実行されると、登録されたメソッドが呼び出されます。実行中にエラーが発生し、このリクエストが強制終了された場合でも、登録されたメソッドは引き続き実行されることに注意してください。

アプリケーション シナリオ 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 関数を呼び出しても表示されます。登録した監視機能も正常に実行されます。

fastcgi_finish_request

機能:
データをクライアントにフラッシュします。このメソッドを呼び出した後は、出力内容はクライアントに出力されません。

アプリケーションシナリオ:

リクエストの処理内容の一部をクライアントに送信する必要がない場合は、まずクライアントに出力する内容を生成してから、このメソッドを呼び出すことができます。メソッドが呼び出された後、コンテンツがクライアントに出力されます。クライアントに出力する必要のないコンテンツは、このメソッドの後に配置できます。これにより応答性が向上します。サンプルコードは以下の通りです。

<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 チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:ウール一次の記事:ウール一