ホームページ  >  記事  >  バックエンド開発  >  php の fastcgi_finish_request とそのノンブロッキング コードの紹介

php の fastcgi_finish_request とそのノンブロッキング コードの紹介

不言
不言オリジナル
2018-08-25 17:21:123439ブラウズ

この記事では、PHP の fastcgi_finish_request とそのノンブロッキング コードについて紹介します。これには一定の参考値があります。必要な友人は参照できます。お役に立てれば幸いです。

まえがき

実際のプロジェクトでは、フロントエンドから送信されたリクエストをバックエンドで長時間処理する必要があるが、ユーザーに提供するためにはこのような要望がよくあります。エクスペリエンスを向上させるため、バックエンドで長期タスクを処理するときに PHP がブロックされるのを防ぎ、ページ要求に迅速に応答するために、fastcgi_finish_request のアプリケーションをここにまとめます。もちろん、PHP でノンブロッキングを実装するには、非同期スクリプトや swoole など、さまざまな方法がありますが、個人的には fastcgi_finish_request が最もシンプルで便利だと思います。

基本アプリケーション

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);

テストの実行

php の fastcgi_finish_request とそのノンブロッキング コードの紹介

php の fastcgi_finish_request とそのノンブロッキング コードの紹介

#非 php-fpm との互換性

#コードの移植性の観点から、次のコードをコードに添付できます:

    if (!function_exists("fastcgi_finish_request")) {
          function fastcgi_finish_request()  {
          }
    }

非 fpm 環境でコードのデプロイメントによって問題が発生することはありません。

プロセスが単一プロセスで実行されることを確認します。

上記の問題について: 高速環境下での過剰な実行時間同時実行により、fastcgi の処理も不十分になり、リリースが間に合わなくなります。同時に、要件はトリガーのみであり、毎回実行する必要はないため、プロセスの重複を避けるために次の方法を使用することを検討できます。

 $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 サイトの他の関連記事を参照してください。

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

関連記事

続きを見る