PHPは非同期呼び出し方法の研究と共有を実現する。


このように一つの問題が発生しました。一つのクライアントの対応するサービスが1秒で実行できるかもしれません。そうすると、ブラウザはずっと待ち状態になります。プログラムの実行が遅いと、ユーザーは根気よくブラウザを停止しないかもしれません。時にはプログラムの実行結果に関心を持たないでください。このように時間を浪費して待つ必要はないです。プログラムをバックグラウンドで静かに実行するのを待つことができないように工夫します。例えば、現在は1000人のユーザに推薦メールを送り、ユーザーがメールアカウントを入力または導入してサーバに提出して送信するシーンがあります。
 
<?php
$count=count($emailarr);
for($i=0;$i<$count;$i++)
{
  sendmail(.....);//
}
?>
このコードのユーザー体験は非常に悪いです。実際に使うこともできません。まずこのように多くのメールを送るとサーバーの運行がタイムアウトします。実は長いユーザの待ち時間はシステム製品に対するユーザーの疑念と自信を失わせます。しかし、ユーザーは1000通のメールを送信してから送信に成功するまで待つ必要はありません。私たちは完全にバックグラウンドを提出してから直接にユーザに送信成功を提示して、バックグラウンドプログラムを静かに順次送信します。この時は「非同期実行」技術が必要です。非同期実行の特徴はバックグラウンドで静かに実行します。ユーザーはコードの実行結果を待つ必要がありません。非同期実行のメリット:1.アプリケーションからの単一タスクへの依存性を逸脱した2.プログラムの実行効率を向上させた3.プログラムの拡張性を向上させた4.一定のシーンでユーザー体験を向上させた5.PHPはマルチスレッドをサポートしていないため、非同期呼出の要求を複数のHTTPのパーティションでプログラム並列実行効果を達成しましたが、要求されたHTTPが多すぎると、注意してください。クライアントページはAJAX技術要求サーバ1を採用しています。一番簡単な方法は、クライアントに返信するHTMLコードにAJAX呼び出しを埋め込むか、または1つのタグを埋め込むか、Srcは実行する時間のかかるスクリプトを指します。この方法が一番簡単で、一番早いです。サーバー側は何の呼び出しもしません。しかし、欠点は、一般的にAjaxはワンロード後にトリガしなければならないということです。つまり、ユーザーがページを開くと、クローズします。私たちのバックグラウンドスクリプトを触発しません。このような方法は厳密な意味での非同期とは言えません。ユーザブラウザは、時間がかかります。phpスクリプトの実行が完了するのを待っています。つまり、ユーザブラウザのステータスバーはまだロードされています。もちろん、scriptタグなどの2.popen関数resource popen(string command、string mode)のような他の同様の原理の方法も使用されてもよい。プロセスを指すパイプラインを開きます。このプロセスは、与えられたcommandコマンドの派生によって実行されます。プロセスを指すパイプラインを開きます。このプロセスは、与えられたcommandコマンドの派生によって実行されます。したがって、呼び出しにより出力を無視することができます。pclose(popen);この方法は第一の方法の欠点を回避し,また迅速である。しかし問題は、この方法はHTTPプロトコルを通じて他のWebServiceを要求することができず、ローカルのスクリプトファイルのみを実行することである。一方通行でしか開けられず、大量のパラメータを着てスクリプトを呼び出すことができません。また、アクセス量が高いと、大量のプロセスが発生します。外部の資源を使ったら、自分で競争を考えなければなりません。3.C URL拡張CURLは、強力なHTTPコマンドラインツールであり、POST/GETなどのHTTP要求をシミュレートしてデータを取得し、抽出し、「標準出力」(stdout)の上に表示される。TIMEOUTは1です。つまり、クライアントは少なくとも1秒を待たなければならない。4.fscokopen()関数fsockopenは非常に強力な関数で、socketプログラミングをサポートしています。fsockopenを使ってメール送信などのsocketプログラムを実現することができます。fcockopenを使うには自分で手動でheader部分の公式文書を作成する必要があります。http://cn.php.net/fsockopen/
 
$ch = curl_init();
$curl_opt = array(CURLOPT_URL, 'http://www.example.com/backend.php',
CURLOPT_RETURNTRANSFER, 1,
CURLOPT_TIMEOUT, 1,);
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);
ですので、全体的に見て、一番簡単なのはやはり第一の方法です。完璧なのは最後の一つですが、複雑でもっといい方法があれば、交流を歓迎します。