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 / socket的东西都将在请求发送后发生在后台,让我可以自由地做其他事情,而不必定期调用curl_multi_exec来确保某个缓冲区没有满的地方需要一个踢来保持去。

3) 第二个循环将等待任何未完成的响应数据到达并完成读取和处理响应。

现在,这仍然不是完全异步的——如果套接字写入缓冲区填满,我可能会在写入请求时被阻塞,但在我的场景中这不是问题,我只担心在我做的时候必须调用 curl_multi_exec中间的其他东西,这样整个事情就不会冻结,直到我下次有机会调用 curl_multi_exec。

对于 2k-4k 响应的一般情况,我也很好,在我进入第二个循环之前,更大的响应会卡在后台什么都不做。

这是 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 握手,甚至不会发送出去请求。

可惜了,mysqli用mysqlnd可以做异步请求,为什么不能curl?

于 2013-08-20T07:50:46.233 回答