ブラウザとサーバー間の通信にはコネクションレス型のHTTPプロトコルしか存在せず、コネクションレス型プログラムの特徴は、クライアントがサーバーにリクエストを行い、サーバーはリクエストに応じて対応するプログラムを出力するという点にあります。持続的な接続。
クライアントの対応するサーバーが 1 秒または 1 分間実行するため、ブラウザは常に待機状態になります。プログラムの実行が遅い場合、ユーザーはブラウザを閉じるのに耐えられない可能性があります。 。
場合によっては、プログラムの実行結果を気にする必要がなく、時間を無駄にして辛抱強く待つ必要はありません。その場合は、プログラムを待たずにバックグラウンドで静かに実行する方法を見つける必要があります。
たとえば、推奨メールを 1,000 人のユーザーに送信するシナリオがあります。ユーザーはメール アカウントを入力またはインポートし、送信のためにサーバーに送信します。
{
sendmail(....);//メールを送信 } ?>
このコードはユーザー エクスペリエンスが非常に悪く、実際には使用できません。まず、大量の電子メールを送信するとサーバーの時間が足りなくなり、ユーザーは待ち時間が長くなり、そのコードに対する信頼を失います。システム製品。ただし、ユーザーは、電子メールを正常に送信する前に 1,000 件の電子メールがすべて送信されるまで待つ必要はありません。バックグラウンドに送信した後、ユーザーに送信が成功するよう直接プロンプトを表示し、バックグラウンド プログラムに電子メールを 1 つずつサイレントに送信させることができます。 。
1. アプリケーションの単一タスクへの依存を取り除く
2. プログラム実行効率の向上
3. プログラムの拡張性の向上
4. 特定のシナリオにおけるユーザーエクスペリエンスの向上
5. PHP はマルチスレッドをサポートしていないため、非同期呼び出しを使用して複数の HTTP をリクエストすると、プログラムの並列実行の効果が得られます。ただし、リクエストされる HTTP リクエストが多すぎると、システムのオーバーヘッドが大幅に増加することに注意してください。
PHP での非同期実行の一般的な方法:
1. クライアント ページは AJAX テクノロジーを使用してサーバーをリクエストします
1. 最も簡単な方法は、クライアントに返される HTML コードに AJAX 呼び出しを埋め込むか、実行される時間のかかるスクリプトを指す src を含む img タグを埋め込むことです。
この方法は最も簡単で最速です。サーバーは呼び出しを行う必要はありません。
ただし、一般に、Ajax は onLoad の後にトリガーされる必要があるという欠点があります。つまり、ユーザーがページをクリックして閉じた場合、バックグラウンド スクリプトはトリガーされません。
imgタグを使用した場合、このメソッドは厳密な意味での非同期実行とは言えません。ユーザーのブラウザは、php スクリプトの実行が完了するまで長時間待機します。つまり、ユーザーのブラウザのステータス バーには、常にロード中であることが表示されます。
もちろん、スクリプトタグなど、同様の原理を持つ他のメソッドを使用することもできます。
2.popen()関数
リソース Popen (文字列コマンド、文字列モード);
// 指定されたコマンドの実行をフォークすることによって生成されたプロセスへのパイプを開きます。指定されたコマンドを生成したコマンドの実行によって生成されたプロセスへのパイプを開きます。
したがって、それを呼び出すことができますが、その出力は無視できます。
?
pclose(popen( "/home/xinchen/backend.php &" , 'r' ));
この方法は、最初の方法の欠点を回避し、高速です。ただし、問題は、このメソッドは HTTP プロトコルを通じて別の Web サービスをリクエストできず、ローカル スクリプト ファイルしか実行できないことです。また、一方向にのみ開くことができ、呼び出されたスクリプトに多数のパラメータを渡すことはできません。
そして、アクセス数が多ければ、大量のプロセスが生成されます。外部リソースを使用する場合は、競合について自分で考慮する必要があります。
3.CURL拡張子
CURL は、POST/GET などの HTTP リクエストをシミュレートし、データを取得して抽出し、「標準出力」(stdout) に表示できる強力な HTTP コマンド ライン ツールです
$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);
CURL を使用するには、CUROPT_TIMEOUT を 1 に設定する必要があります (最小値は 1 です)。つまり、クライアントは少なくとも 1 秒待つ必要があります。
4.fskoopen()関数
fsockopen は、ソケットプログラミングをサポートする非常に強力な関数です。fsockopen を使用して、メール送信などのソケットプログラムを実装できます。fcockopen を使用するには、ヘッダー部分を自分で手動で結合する必要があります
公式ドキュメント: http://cn.php.net/fsockopen/
?
$fp = fsockopen ( "www.2cto.com" , 80, $errno , $errstr , 30);
if (! $fp ) {
echo "$errstr ($errno)
n" ;
} その他 {
$out = "GET /backend.php / HTTP/1.1rn" ;
$out .= "ホスト: www.2cto.comrn" ;
$out .= "接続: 閉じるrnrn" ;
fwrite( $fp , $out );
/*実行結果を無視します
一方 (!feof($fp)) {
エコー fgets($fp, 128);
}*/
fclose( $fp );
}
qeenoo