PHP非同期実行方法、シミュレーションマルチスレッドの応用分析

2273 ワード

PHP自体にはマルチスレッドのものはありませんが、曲線の方法で同じ効果を生み出すことができます.例えば、マルチプロセスの方法で非同期呼び出しを達成することは、コマンドモードに限られています.
もう1つのより簡単な方法は、Webプログラムで使用することができます.それは、fsockopen()、fputs()でURLを要求し、戻るのを待つ必要がなく、その要求されたページ(URL)で何かをすると非同期になります.
キーコードは次のとおりです.
 
  
  $fp = fsockopen('localhost',80,&$errno,&$errstr,5); 
  if(!$fp)
     {
         echo "$errstr ($errno)
/n";
     }
     fputs($fp,"GET another_page.php?flag=1/r/n");
     fclose($fp);

上のコードはページにanother_page.phpがリクエストを送信しても構わないので、リクエストページの応答データを待つ必要はなく、これを利用してリクエストされたページanother_page.phpでは非同期で何かをしました.
例えば、新しいログを発表するたびに、すべてのログの購読者にメール通知を送る必要があります.
通常の方法では、
ログが書き終わる->ポイントコミットボタン->ログがデータベースに挿入される->メール通知の送信->作成者にパブリッシュに成功したことを通知すると、作成者はポイントコミットボタンから成功プロンプトを見るまで、メールの送信を待つことができます.たとえば、メールサービスの接続が異常であるか、デバイスが遅いか、サブスクライバが多すぎるなどです.実際には、メールの送信が成功するかどうかにかかわらず、ログの保存が成功することを保証するのは基本的に受け入れられるため、メールの送信を待つプロセスは非常に経済的ではありません.このプロセスは非同期で実行することができ、メールの送信の結果はあまり関心がなく、ログ形式で記録されています.
改善されたプロセスは次のとおりです.
ログの書き上げ->ポイントコミットボタン->ログをデータベースに挿入->作成者にメールの送信に成功したことを知らせる通知->実際のプログラムを書いてテストします.write.の2つのファイルがあります.phpとsendmail.php、sendmail.phpはsleep(seconds)を用いてプログラム実行の使用時間をシミュレートする.
write.php、実行に1秒かかります.
 
  
   function asyn_sendmail()
     {
         $fp = fsockopen('localhost',80,&$errno,&$errstr,5); 
      if(!$fp)
         {
            echo "$errstr ($errno)
/n";
         }
     sleep(1);
     fputs($fp,"GET /sendmail.php?param=1/r/n"); # URL
     fclose($fp);
    } 
 echo time().'
';
 echo 'call asyn_sendmail
';
 asyn_sendmail();
 echo time().'
';

sendmail.php、実行に10秒かかります.
 
  
sleep(10);
fopen("C:/" . time(),  "w"); 

ページからwrite.php,ページ出力:1272472697
call asyn_sendmail
1272472698
また、C:/生成ファイル:
1272472708
上の結果からsendmailがわかります.phpは少なくとも10秒かかるがwrite.phpは引き続き実行され,このプロセスが非同期であることを示した.