ホームページ  >  記事  >  バックエンド開発  >  PHP スケジュールされたタスクと fsockopen 連続プロセスの例_PHP チュートリアル

PHP スケジュールされたタスクと fsockopen 連続プロセスの例_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:29:34642ブラウズ

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);
if (!$fp) {
return FALSE }
$getPath = $ url_array['path '] ."?". $url_array['query'];
if(!empty($post_data)){
$method = "POST" }
$header = " " . $getPath;
$header .= " HTTP/1.1rn";
$header .= "Host: ". $url_array['host'] . "rn ";以下のヘッダー情報フィールドは省略可能です
$header .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 rn";
$header .= "受け入れる: text/xml,application/xml,application/xhtml+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 ";
$header .= "Accept-Encoding: gzip,deflatern"
*/

$header .= "Connection:Closern"; if(!empty($cookie )){
$_cookie = strval(NULL);
foreach($cookie as $k => $v){
$_cookie .= $k."=".$v." ; ";
}
$ cookie_str = "Cookie: " .base64_encode($_cookie) ." rn"; // Cookie を渡す
$header .= $cookie_str;
}
if(!empty($post_data)){
$_post = strval(NULL) ;
foreach($post_data as $k => $v){
$_post .= $k."=".$v."&";
$post_str = "コンテンツ-Type: application/x- www-form-urlencodedrn";
$post_str .= "Content-Length: ".strlen($_post) ." rn"; //POST データの長さ
$post_str .= $_post ."rnrn "; //POST データを転送
$header .= $post_str;
fwrite($fp, $header); // サーバーは
fclose( $fp);
true を返す }

このように、PHP スクリプトの実行は fsockopen() 関数を通じてトリガーされ、関数は戻ります。 次に、次のステップに進みます。
現在問題が発生しています。クライアントが切断されると、つまりtriggerRequestがリクエストを送信した後、接続はすぐに閉じられ、サーバー上で実行されているスクリプトが終了する可能性があります

PHP 内部では、システムは接続ステータスを維持しており、そのステータスには 3 つの状況が考えられます:

* 0 – NORMAL (正常)
* 1 – ABORTED (異常終了)
* 2 – TIMEOUT (タイムアウト)

NORMAL 状態で PHP スクリプトが正常に実行される場合、接続は有効です。クライアントが切断されると、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() で実行のシャットダウン時に呼び出すことができる別の関数を設定できない限り、スクリプトは中断されます。これは、スクリプトの実行が完了したとき、または PHP が予期せず終了したときを意味します。実行がシャットダウンされようとしている場合、関数が呼び出されます。リモート ユーザーが STOP ボタンをクリックし、スクリプトがデータを再度出力しようとすると、PHP は接続が中断されたことを検出し、シャットダウン トリガー関数を呼び出します。

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

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

したがって、トリガーされるスクリプトにも指定します:

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

ignore_user_abort(TRUE) //クライアントが切断しても、スクリプトは中止されません
set_time_limit(0); /スクリプト実行の遅延をキャンセルします 制限時間
または次を使用します:
register_shutdown_function(callback fuction[,parameters]); //登録スクリプト終了時に実行される関数

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