はじめに: これは PHP 非同期呼び出しの詳細ページであり、PHP 関連の知識、スキル、経験、および一部の PHP ソース コードなどを紹介します。
class='pingjiaF' フレームボーダー='0' src='http://biancheng.dnbcw.info/pingjia.php?id=329776' スクロール='no'>ブラウザとサーバー間の接続はHTTP プロトコル 接続通信用。これは、リクエストとレスポンスのモデルに基づいたプロトコルです。ブラウザは URL を通じてサーバーへのリクエストを開始し、Web サーバーはリクエストを受信し、プログラムを実行し、対応する HTML コードをクライアントに送信して応答します。
Web サーバーがプログラムを実行するときに、数ミリ秒で完了する場合もあれば、数分以内に完了しない場合もあります。プログラムの実行が遅い場合、ユーザーはそれ以上待つ忍耐力がなくなり、ブラウザを閉じる可能性があります。
場合によっては、これらの時間のかかるスクリプトの戻り結果を気にしないこともありますが、次のステップに進む前に、スクリプトの実行が完了して戻るまで待つ必要があります。
それでは、これらの時間のかかるスクリプトの呼び出しを単純にトリガーして次のステップに進み、これらの時間のかかるスクリプトをサーバー側でゆっくり実行できるようにする方法はあるのでしょうか?
テスト後、いくつかの方法をまとめて共有します:
1. 最も簡単な方法は、クライアントに返される HTML コードに AJAX 呼び出しを埋め込むか、img タグを埋め込んで、src が対象のリソースを指すようにすることです。タイムスクリプトが実行されました。
この方法は最も簡単で早いです。サーバーは呼び出しを行う必要はありません。
ただし、欠点は、一般に、Ajax は onLoad の後にトリガーされる必要があることです。つまり、ユーザーがページをクリックして閉じた場合、バックグラウンド スクリプトはトリガーされません。
imgタグを使用した場合、このメソッドは厳密な意味での非同期実行とは言えません。ユーザーのブラウザは、php スクリプトの実行が完了するまで長時間待機します。つまり、ユーザーのブラウザのステータス バーには、常にロード中であることが表示されます。
もちろん、スクリプトタグなど、同様の原理を持つ他のメソッドも使用できます。
2. Popen()
resource Popen (string command, string mode);
//指定されたコマンドコマンドの実行の結果として生じるプロセスを指すパイプを開きます。指定されたコマンドを生成したコマンドの実行によって生成されたプロセスへのパイプを開きます。
したがって、それを呼び出すことはできますが、その出力は無視できます。
pclose(popen("/home/xinchen/backend.php &", 'r'));このメソッドは、最初のメソッドの欠点を回避し、また高速です。ただし、問題は、このメソッドは HTTP プロトコルを通じて別の Web サービスをリクエストできず、ローカル スクリプト ファイルしか実行できないことです。また、一方向にのみ開くことができ、呼び出されたスクリプトに多数のパラメータを渡すことはできません。
そして、アクセス数が多ければ、大量のプロセスが生成されます。外部リソースを使用する場合は、競合について自分で考慮する必要があります。
3. CURL
メソッドを使用し、CUROPT_TIMEOUT を 1 に設定します (最小値は 1 です)。つまり、クライアントは少なくとも 1 秒待つ必要があります。
$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);
4. fsockopen を使用する
この方法は最も完璧なはずですが、欠点は HTTP ヘッダー部分を自分で記述する必要があることです。
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);if (!$fp) { echo "$errstr ($errno)<br />\n";} else { $out = "GET /backend.php / HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); /*忽略执行结果while (!feof($fp)) {echo fgets($fp, 128);}*/ fclose($fp);}
転載元: http://www.laruence.com/2008/04/14/318.html
「php 非同期呼び出し」の関連記事をもっと見る》
J2EE と focus を愛するJava マイケル ジャクソン ビデオ サイト JSON オンライン ツール
http://biancheng.dnbcw.info/php/329776.html pageNo:12