PHPで非同期呼び出しメソッドを実装する方法

小云云
リリース: 2023-03-21 22:54:02
オリジナル
8515 人が閲覧しました

ブラウザとサーバー間の接続と通信は、HTTP プロトコルを介して行われます。これは、リクエストとレスポンスのモデルに基づいたプロトコルです。ブラウザは URL を通じてサーバーへのリクエストを開始し、Web サーバーはリクエストを受信し、プログラムを実行し、対応する HTML コードをクライアントに送信して応答します。

Webサーバーがプログラムを実行する際、数ミリ秒で完了する場合もあれば、数分以内に完了しない場合もあります。プログラムの実行が遅い場合、ユーザーはそれ以上待つ忍耐力がなくなり、ブラウザを閉じる可能性があります。

場合によっては、これらの時間のかかるスクリプトの戻り結果を気にしないこともありますが、次のステップに進む前に、スクリプトの実行が完了して戻るまで待つ必要があります。 それでは、これらの時間のかかるスクリプトの呼び出しを単純にトリガーして次のステップに進み、これらの時間のかかるスクリプトをサーバー側でゆっくり実行できるようにする方法はあるのでしょうか?

テスト後、いくつかの方法をまとめて共有します。 1. 最も簡単な方法は、クライアントに返される HTML コードに AJAX 呼び出しを埋め込むか、実行される時間のかかるスクリプトを指す src を含む img タグを埋め込むことです。 この方法は最も簡単で最速です。サーバーは呼び出しを行う必要はありません。 ただし、一般に、Ajax は onLoad の後にトリガーされる必要があるという欠点があります。つまり、ユーザーがページをクリックして閉じた場合、バックグラウンド スクリプトはトリガーされません。 imgタグを使用した場合、このメソッドは厳密な意味での非同期実行とは言えません。ユーザーのブラウザは、php スクリプトの実行が完了するまで長時間待機します。つまり、ユーザーのブラウザのステータス バーには、常にロード中であることが表示されます。 もちろん、スクリプト タグなど、同様の原理を持つ他のメソッドも使用できます。

2. Popen()

リソース Popen (文字列コマンド、文字列モード); // 指定されたコマンドの実行をフォークすることによって生成されたプロセスへのパイプを開きます。指定されたコマンドを生成したコマンドの実行によって生成されたプロセスへのパイプを開きます。

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

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);
}
ログイン後にコピー

したがって、総合的に見て、最良かつ最も簡単な方法は最初の方法です。
最も完璧なものは最後のものであるべきですが、それはより複雑です。

関連する推奨事項:

JavaScript 非同期呼び出しの例の分析

非同期呼び出しマルチスレッドを実装するための php メソッド

JavaScript 非同期呼び出しメソッドについて

以上がPHPで非同期呼び出しメソッドを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート