この記事では、PHP の fastcgi_finish_request とそのノンブロッキング コードについて紹介します。これには一定の参考値があります。必要な友人は参照できます。お役に立てれば幸いです。
実際のプロジェクトでは、フロントエンドから送信されたリクエストをバックエンドで長時間処理する必要があるが、ユーザーに提供するためにはこのような要望がよくあります。エクスペリエンスを向上させるため、バックエンドで長期タスクを処理するときに PHP がブロックされるのを防ぎ、ページ要求に迅速に応答するために、fastcgi_finish_request のアプリケーションをここにまとめます。もちろん、PHP でノンブロッキングを実装するには、非同期スクリプトや swoole など、さまざまな方法がありますが、個人的には fastcgi_finish_request が最もシンプルで便利だと思います。
(PHP 5 >= 5.3.3, PHP 7)
fastcgi_finish_request — すべての応答データをクライアントにフラッシュします
boolean fastcgi_finish_request (void)この関数は、クライアントへのすべての応答データをフラッシュし、リクエストを終了します。これにより、実行に長時間かかるタスクは、クライアントが接続を終了した後も実行を継続できます。
成功した場合は TRUE を返し、失敗した場合は FALSE を返します
PHP および Web サーバーは If を使用しますPHP-FPM (FastCGI Process Manager) がインストールされているため、fastcgi_finish_request() 関数を通じてセッションを即座に終了でき、PHP スレッドはバックグラウンドで実行を継続できます。つまり、この関数は php-fpm のプロセス管理メソッドでのみ使用できます。
コードがこの場所まで実行されている限り、リクエストは切断されており、パラメーターはクライアントに返却されました。次のコードはクライアントとは関係がありません。つまり、ページ上のコンテンツ出力は fastcgi_finish_request 関数の前に配置する必要があります
fastcgi_finish_request() がクライアント接続を終了した後も、実行時間は max_execution_time タイムアウトの影響を受けます。つまり、バックエンドでのコードの実行に長時間かかることが予想される場合でも、set_time_limit(0)
を設定する必要があります。同時実行性が高い状態で長すぎると、fastcgi プロセスが十分に使用されず、時間内に解放できなくなり、502 エラーが発生します。
echo "program start..."; file_put_contents('/tmp/garylog.log','start-time:'.date('Y-m-d H:i:s')."\n", FILE_APPEND); fastcgi_finish_request();sleep(1); // set_time_limit(0); // sleep(150); $num = 25; $num += 1; sleep(5); echo 'debug...'; file_put_contents('/tmp/garylog.log', 'start-proceed:'.$num.',时间'.date('Y-m-d H:i:s')."\n", FILE_APPEND); sleep(10); file_put_contents('/tmp/garylog.log', 'end-time:'.date('Y-m-d H:i:s')."\n", FILE_APPEND);
#コードの移植性の観点から、次のコードをコードに添付できます:
if (!function_exists("fastcgi_finish_request")) { function fastcgi_finish_request() { } }
非 fpm 環境でコードのデプロイメントによって問題が発生することはありません。
プロセスが単一プロセスで実行されることを確認します。
$processId = realpath(__FILE__) . '-' . get_class($this); $filename = md5($processId); $file = '/tmp/'.$filename; if(!file_exists($filename)){ file_put_contents($file, getmypid()); }else{ return true; } ## do somthing 需要长时间处理的代码 //处理完成后删除进程id记录文件 unlink($file);
関連する推奨事項:
php の魔法の fastcgi_finish_request
#PHP では、fastcgi_finish_request() 関数を使用して非同期操作を実装し、応答速度の向上
以上がphp の fastcgi_finish_request とそのノンブロッキング コードの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。