0

基本的に、私はPHPで次のことを行う方法を探しています:

http_get_or_post('an.url', 'or.two');

// Do some work here, not worrying about the http going on in the background.

$r = wait_for_and_get_the_results_of_the_http_requests()

そして、curl の経験が豊富な人なら、curl_multi が私が探しているものであることを確認できるかもしれません。

http://php.net/manual/en/function.curl-multi-init.phpから収集したものから、そこにあるサンプルで必要なものが得られる場合があります。

$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
$mh = curl_multi_init();
curl_multi_add_handle($mh,$ch1);

$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

// Now, am I free to do some time consuming work here and not worry about
// calling curl_multi_exec every now and then to facilitate the background
// http / socket processes?

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

curl_multi_remove_handle($mh, $ch1);
curl_multi_close($mh);

さて、主な質問は、これが何をするかについての私の理解は正しいですか?

1)最初のループは、ソケットへのリクエストの送信/書き込みのみを処理します。

2) リクエストが送信された後、すべての http / ソケット処理がバックグラウンドで実行されるため、curl_multi_exec を定期的に呼び出してバッファがどこかでいっぱいになっておらず、保持するためにキックが必要であることを確認する必要がなく、他の処理を自由に行うことができます。行きます。

3) 2 番目のループは、未処理の応答データが到着するのを待ち、応答の読み取りと処理を終了します。

さて、これはまだ完全に非同期ではありません.ソケットの書き込みバッファがいっぱいになると、リクエストの書き込みがブロックされる可能性がありますが、私のシナリオではそれは問題ではありません。次に curl_multi_exec を呼び出す機会が来るまで、全体がフリーズしないようにします。

これは、2k-4k 応答の一般的なシナリオの場合でも問題ありません。より大きな応答は、2 番目のループに到達するまでバックグラウンドで何もせずにスタックします。

これはcurl_multiの仕組みですか?そうでない場合、PHP でこれを行うには何が提案できますか?

4

2 に答える 2

0

curl_multi は、一度に非常に小さな作業を行います。curl_multi_exec を呼び出すたびに、転送操作の一部が実行され、十分な回数呼び出してデータが送受信されると、完了です。

于 2013-08-20T07:50:06.613 に答える
0

いくつかのテストを行ったところ、要するに - いいえ、これは curl_multi での動作ではありません - curl_multi_exec を呼び出し続ける必要があります。それがないと、最初のループは接続で TCP ハンドシェイクを実行するだけで、送信さえしません。リクエスト。

残念なことに、mysqlnd を使用する mysqli は非同期要求を実行できますが、なぜカールできないのでしょうか?

于 2013-08-20T07:50:46.233 に答える