ホームページ > バックエンド開発 > PHPチュートリアル > PHP非同期実行の詳しい解説_PHPチュートリアル

PHP非同期実行の詳しい解説_PHPチュートリアル

WBOY
リリース: 2016-07-21 15:09:58
オリジナル
848 人が閲覧しました

Web サーバーは PHP スクリプトを実行しますが、実行結果が返されるまでに時間がかかる場合があり、後続のスクリプトは実行を続行するまでに長時間待機する必要があります。時間のかかるスクリプトの実行結果を待たずに単純に実行をトリガーし、次の操作を直接実行したい場合は、fskokopen 関数を使用できます。
PHP はソケット プログラミングをサポートしています。fscokopen 関数はリモート ホスト接続へのハンドルを返し、fopen から返されたハンドルを使用するのと同じように、fwrite、fgets、fread などの操作を実行できます。 fsockopen を使用してローカル サーバーに接続し、スクリプトの実行をトリガーし、スクリプトの実行が完了するのを待たずにすぐに戻ることで、PHP を非同期で実行する効果が得られます。
サンプルコードは次のとおりです:

コードをコピーします コードは次のとおりです:

functiontriggerRequest($url, $post_data = array(), $cookie = array()){
$method = "GET" // POST または GET を通じてトリガーされるスクリプトにいくつかのパラメーターを渡します。
$url_array = parse_url($url); // URL 情報を取得します
$port = isset($url_array['port']) : 80; $fp = fsockopen($url_array['host ']、$port、$errno、$errstr、30);
' ‐ ' ' ' s '' ' ‐ ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ ‐‐ ' ];
$header .= "ホスト: ". 'host'] . "rn "; //HTTP 1.1 ホストドメインは省略できません
/*以下のヘッダー情報フィールドは省略可能です
$header .= "User-Agent: Mozilla/ 5.0 (Windows, +xml,text/ html;q=0.9,text/plain;q=0.8,image/png,q=0.5 rn";
$header .= "Accept-Language: en-us,en;q=0.5 "; Er $ header. = "Accept-Encoding: GZIP, Deflatorn";
*/
$ Header. = "Connection: Closern"; foreach($cookie as $k => $v){
$_cookie) 。 // Cookie
$header .= $cookie_str; foreach($post_data as $k => $ v){
$_post .= $k."=".$v."&"; $post_str .= " Content-Length: ".strlen($_post) .rn"; //POST データの長さ
Content-Length: fwrite($fp, $header);
fwrite($f p, $header);
このように、PHP スクリプトの実行は fsockopen() 関数を通じてトリガーされ、関数は戻ります。 次に、次のステップに進みます。
現在、問題が発生しています。クライアントが切断されると、つまり、triggerRequest がリクエストを送信した後、接続はすぐに閉じられ、サーバー上で実行されているスクリプトが終了する可能性があります。
PHP 内部では、システムは接続ステータスを維持しており、そのステータスには 3 つの状況が考えられます:
* 0 – NORMAL (正常)
* 1 – ABORTED (異常終了)
* 2 – TIMEOUT (タイムアウト)
いつPHP スクリプトが NORMAL 状態で正常に実行されている場合、接続は有効です。クライアントが切断されると、ABORTED ステータス フラグがオンになります。リモート クライアント接続の中断は通常、ユーザーが [STOP] ボタンをクリックしたことによって発生します。接続時間が PHP の制限時間 (set_time_limit() 関数を参照) を超えると、TIMEOUT ステータス フラグがオンになります。

クライアントが切断されたときにスクリプトを終了する必要があるかどうかを決定できます。スクリプトの出力を受け入れるリモート ブラウザがない場合でも、スクリプトを完全に実行すると便利な場合があります。デフォルトでは、リモート クライアント接続が失われたときにスクリプトが終了します。この処理は、php.ini のignore_user_abort によって、または Apache .conf 設定の対応する "php_valueignore_user_abort" およびignore_user_abort() 関数によって制御できます。 PHP がユーザーの中断を無視するように指示されていない場合、 register_shutdown_function() によってシャットダウン トリガー関数が設定されない限り、スクリプトは中断されます。このクローズ トリガー関数により、リモート ユーザーが [STOP] ボタンをクリックし、スクリプトがデータを再度出力しようとすると、PHP は接続が中断されたことを検出し、クローズ トリガー関数を呼び出します。

スクリプトは、組み込みのスクリプト タイマーによって中断される場合もあります。デフォルトのタイムアウト制限は 30 秒です。この値は、php.ini で max_execution_time を設定するか、Apache .conf 設定の対応する「php_value max_execution_time」パラメータまたは set_time_limit() 関数を設定することで変更できます。カウンタがタイムアウトすると、上記の接続中断状況と同様にスクリプトが終了し、事前に登録されたシャットダウン トリガー関数もこの時点で実行されます。シャットダウン トリガー関数では、connection_status() 関数を呼び出すことで、タイムアウトによってシャットダウン トリガー関数が呼び出されたかどうかを確認できます。タイムアウトによりシャットダウン トリガー関数が呼び出された場合、関数は 2 を返します。

注意すべき点の 1 つは、ABORTED 状態と TIMEOUT 状態が同時に有効になる可能性があるということです。これは、PHP にユーザー終了アクションを無視するように指示する場合に可能です。 PHP はユーザーが切断されたことを認識しますが、スクリプトはまだ実行中です。実行時間制限に達すると、スクリプトは終了し、設定されたシャットダウン トリガー関数も実行されます。この時点で、関数 connection_status() が 3 を返すことがわかります。
したがって、トリガーされるスクリプトにも指定します:
コードをコピーします コードは次のとおりです:

Ignore_user_abort(TRUE);//クライアントが切断された場合、スクリプトは中止されますは発生しません
set_time_limit(0);//スクリプト実行遅延の上限を解除します
Or use:
register_shutdown_function(callback function[,parameters]);//スクリプト実行時に実行する関数を登録します出口

www.bkjia.com本当http://www.bkjia.com/PHPjc/327236.html技術記事 Web サーバーは PHP スクリプトを実行しますが、実行結果が返されるまでに時間がかかる場合があり、後続のスクリプトは実行を続行するまでに長時間待機する必要があります。時間のかかるシンプルなトリガーを実現したい場合...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート