php実装計画タスクと持続プロセスインスタンスfsockopen


WebサーバはPHPスクリプトを実行し、実行結果を返すのに時間がかかる場合があります.後のスクリプトは実行を続行するのに長い時間待たなければなりません.実行結果を待たずに時間のかかるスクリプトの実行のみを単純にトリガして次の操作を直接実行するには、fscokopen関数を使用します.
PHPはsocketプログラミングをサポートし、fscokopen関数はリモートホストに接続されたハンドルを返し、fopenで返されたハンドルのようにfwrite、fgets、freadなどの操作を行うことができます.fsockopenを使用してローカルサーバに接続し、スクリプトの実行をトリガーし、すぐに戻り、スクリプトの実行が完了するのを待たずに、PHPを非同期で実行する効果を実現します.
<?
function triggerRequest($url, $post_data = array(), $cookie = array()){
        $method = "GET";  //  POST  GET             
        $url_array = parse_url($url); //  URL  
        $port = isset($url_array['port'])? $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 = $method . " " . $getPath;
        $header .= " HTTP/1.1\r
"; $header .= "Host: ". $url_array['host'] . "\r
"; //HTTP 1.1 Host /* $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 \r
"; $header .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,q=0.5 \r
"; $header .= "Accept-Language: en-us,en;q=0.5 "; $header .= "Accept-Encoding: gzip,deflate\r
"; */ $header .= "Connection:Close\r
"; if(!empty($cookie)){ $_cookie = strval(NULL); foreach($cookie as $k => $v){ $_cookie .= $k."=".$v."; "; } $cookie_str = "Cookie: " . base64_encode($_cookie) ." \r
"; // Cookie $header .= $cookie_str; } if(!empty($post_data)){ $_post = strval(NULL); foreach($post_data as $k => $v){ $_post .= $k."=".$v."&"; } $post_str = "Content-Type: application/x-www-form-urlencoded\r
"; $post_str .= "Content-Length: ". strlen($_post) ." \r
"; //POST $post_str .= $_post."\r
\r
"; // POST $header .= $post_str; } fwrite($fp, $header); //echo fread($fp, 1024); // fclose($fp); return true; }

これによりfsockopen()関数でPHPスクリプトの実行をトリガーし、関数が返されます.次に次の操作を行います.
クライアントが接続を切断した後、triggerRequestが要求を送信した後、すぐに接続を閉じると、サーバ側で実行中のスクリプトが終了する可能性があります.
PHP内部では、システムは接続状態を維持しており、その状態には3つの可能性がある.
*0–NORMAL(正常)
*1–ABORTED(異常終了)
*2–TIMEOUT(タイムアウト)
PHPスクリプトがNORMAL状態で正常に動作している場合、接続は有効です.クライアントが接続を中断すると、ABORTEDステータスのタグが開きます.リモートクライアント接続の中断は、通常、ユーザがSTOPボタンをクリックしたことによるものである.接続時間がPHPの時限を超えると(set_time_limit()関数を参照)、TIMEOUT状態のタグが開きます.
スクリプトがクライアントが接続を中断したときに終了する必要があるかどうかを決定できます.リモートブラウザがスクリプトの出力を受け入れなくても、スクリプトを完全に実行すると便利になる場合があります.デフォルトでは、リモートクライアント接続が中断されるとスクリプトが終了します.この処理はphp.iniのignore_user_Apache.conf設定で対応する「php_value ignore_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を返します.
トリガするスクリプトには、次のように指定されています.
<?php
  ignore_user_abort(TRUE); //         ,      abort
  set_time_limit(0); //          
または使用:
<?php
  register_shutdown_function(callback fuction[, parameters]); //