PHP非ブロックモード

4622 ワード

PHPをブロックしないようにするPHPをバックエンド処理として長時間処理を行う必要がある場合、ページ要求に迅速に応答するために結果を返さずに判断を下す場合、以下のような措置が可能である.echo "program start." ;
  file_put_contents ( 'log.txt' , 'start-time:' . date ( 'Y-m-d H:i:s' ), FILE_APPEND); fastcgi_finish_request(); sleep(1); echo 'debug...' ; file_put_contents ( 'log.txt' , 'start-proceed:' . date ( 'Y-m-d H:i:s' ), FILE_APPEND);
  sleep(10); file_put_contents ( 'log.txt' , 'end-time:' . date ( 'Y-m
この例の出力結果は出力プログラムstart.後でセッションが戻ってくるので、debugの出力ブラウザは受信できませんが、log.txtファイルは3つの完了時間を完全に受信できます.
二、fsockopen、cUrlの非ブロックモードを使用して別のウェブサイトを要求する$fp = fsockopen ( "www.example.com" , 80, $errno , $errstr , 30); if (! $fp ) die ( 'error fsockopen' ); stream_set_blocking( $fp ,0); $http = "GET /save.php  / HTTP/1.1\r
"
;    $http .= "Host: www.example.com\r
"
;    $http .= "Connection: Close\r
\r
"
; fwrite( $fp , $http ); fclose( $fp );
cURLのcurl_を利用multi_*関数非同期要求の送信{{かんすう:ひどうきようきゅうのそうしん}}$cmh = curl_multi_init(); $ch1 = curl_init(); curl_setopt( $ch1 , CURLOPT_URL, "http://localhost:6666/child.php" ); curl_multi_add_handle( $cmh , $ch1 ); curl_multi_exec( $cmh , $active ); echo "End
"
;
三、Gearman、Swooleを使用してGearmanを拡張するのはphp拡張を持つ分布式非同期処理フレームワークであり、大量の非同期タスクを処理することができる.Swooleは最近とても火がついていて、非同期の方法がたくさんあって、使いやすいです.(ホコリ注:PHPの再定義と称し、NodeJSを完膚なきまでに吹き飛ばす.Swooleツールは良いが、拡張自体はNodeJSとは比べものにならないような気がする)
四、redisなどのキャッシュ、キューを使用して、データをキャッシュに書き込み、バックグラウンド計画タスクを使用してデータ非同期処理を実現する.この方法は一般的な大流量アーキテクチャでよく見られるでしょう.
五、極端な場合、システムコマンドを呼び出すことができ、データをバックグラウンドタスクに伝えることができ、個人的には効率的ではないと感じます.$cmd = 'nohup php ./processd.php $someVar >/dev/null  &' ; ` $cmd `
六、外国人の大技、理解できなかった、php原生支持http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html
七、pcntl拡張をインストールし、pcntl_を使用するfork生成サブプロセス非同期実行タスクは,個人的には最も便利であるがzombie processも出現しやすい.if (( $pid = pcntl_fork()) == 0) {      child_func();    // , } else {      father_func();   // }
  echo "Process " . getmypid () . " get to the end.
"
;
  function father_func() {      echo "Father pid is " . getmypid () . "
"
; }
  function child_func() {      sleep(6);      echo "Child process exit pid is " . getmypid () . "
"
;      exit (0); }