PHP非同期呼び出し実装方法

巴扎黑
巴扎黑オリジナル
2016-11-23 13:17:191097ブラウズ

ブラウザとサーバー間の通信にはコネクションレス型のHTTPプロトコルしか存在せず、コネクションレス型プログラムの特徴は、クライアントがサーバーにリクエストを行い、サーバーはリクエストに応じて対応するプログラムを出力するという点にあります。持続的な接続。

クライアントの対応するサーバーが 1 秒または 1 分間実行する可能性があり、このようにプログラムの実行が遅い場合、ユーザーは忍耐力を持たない可能性があります。をクリックしてブラウザを閉じます。

場合によっては、プログラムの実行結果を気にする必要はありません。このように時間を無駄にして辛抱強く待つ必要はありません。その場合は、プログラムを待たずにバックグラウンドで静かに実行する方法を見つける必要があります。

たとえば、ユーザーが電子メール アカウントを入力またはインポートし、送信のためにサーバーに送信するシナリオがあります。

<?php  
$count=count($emailarr);for($i=0;$i<$count;$i++)  
{  
  sendmail(.....);//发送邮件  }  ?>

このコードはユーザーエクスペリエンスが非常に悪く、実際には使用できません。まず、あまりにも多くのメールを送信すると、サーバーがタイムアウトしてしまいます。実際、ユーザーの待ち時間が長いため、ユーザーは疑問を感じ、損をすることになります。システム製品への自信。ただし、ユーザーは、電子メールを正常に送信する前に 1,000 件の電子メールがすべて送信されるまで待つ必要はありません。バックグラウンドに送信した後、ユーザーに送信が成功するよう直接プロンプトを表示し、バックグラウンド プログラムに電子メールを 1 つずつサイレントに送信させることができます。 。

このとき、コードを実行するには「非同期実行」技術が必要です。非同期実行の特徴は、ユーザーがコードの実行結果を待つ必要がないことです。 :

1. 単一タスクの依存関係を取り除く

2. プログラムの実行効率を向上させる

4. 特定のシナリオにおけるユーザーエクスペリエンスを向上させる

5. PHP はマルチスレッドをサポートしていないため、非同期呼び出しリクエストを使用します。 複数の HTTP メソッドはプログラムの並列実行の効果を実現しますが、HTTP リクエストが多すぎるとシステムのオーバーヘッドが大幅に増加することに注意してください。テクノロジー リクエスト サーバー

1. 最も簡単な方法は、クライアントに返される HTML コードに AJAX 呼び出しを埋め込むか、実行される時間のかかるスクリプトを指す src を含む img タグを埋め込むことです。

この方法は最も簡単で早いです。サーバーは呼び出しを行う必要はありません。

ただし、欠点は、一般に、Ajax は onLoad の後にトリガーされる必要があることです。つまり、ユーザーがページをクリックして閉じた場合、バックグラウンド スクリプトはトリガーされません。

imgタグを使用した場合、このメソッドは厳密な意味での非同期実行とは言えません。ユーザーのブラウザは、php スクリプトの実行が完了するまで長時間待機します。つまり、ユーザーのブラウザのステータス バーには、常にロード中であることが表示されます。

もちろん、スクリプトタグなど、同様の原則を持つ他のメソッドを使用することもできます


2.popen() function

resource Popen (string command, string mode);
//パイプを開きますprocess を指している場合、プロセスは指定されたコマンド command の実行によって生成されます。指定されたコマンドを生成したコマンドの実行によって生成されたプロセスへのパイプを開きます。

したがって、それを呼び出すだけで、その出力は無視できます。

?


pclose(popen("/home/xinchen/backend.php &", 'r'));

この方法は、最初の方法の欠点を回避し、また高速です。ただし、問題は、このメソッドは HTTP プロトコルを通じて別の Web サービスをリクエストできず、ローカル スクリプト ファイルしか実行できないことです。また、一方向にのみ開くことができ、呼び出されたスクリプトに多数のパラメータを渡すことはできません。

そして、アクセス数が多ければ、大量のプロセスが生成されます。外部リソースを使用する場合は、競合について自分で考慮する必要があります。

3.CURL 拡張機能

CURL は、POST/GET などの HTTP リクエストをシミュレートし、データを取得して抽出し、「標準出力」(stdout) に表示できる強力な HTTP コマンド ライン ツールです。 - -EndFragment-->


$ch =curl_init();

$curl_opt = array(CURLOPT_URL, 'http://www.example.com/backend.php',

,

CURLOPT_TIMEOUT, 1 ,) ;

curl_setopt_array($ch, $curl_opt);

curl_exec($ch);


curl_close($ch);




CURL を使用するには、CUROPT_TIMEOUT を 1 に設定する必要があります (最小値は 1、押し下げられた)。つまり、クライアントは少なくとも 1 秒待つ必要があります。 9b21ee6b58e97765e2a3d44fcda3f6db


4.fskokopen() 関数

fsockopen は、ソケット プログラミングをサポートする非常に強力な関数です。fsockopen を使用して、電子メール送信などのソケット プログラムを実装できます。手動で fcockopen を使用します ヘッダー部分を接続します

公式ドキュメント: http://cn.php.net/fsockopen/

?
$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);
}

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PHPリファレンス次の記事:PHPリファレンス