统计发出了多少 curl_multi 次请求
Count how many curl_multi requests have been made
我想知道在使用 curl_multi 时每个 curl 请求是什么时候发出的。
到目前为止我的代码:
$i = 0;
do {
$status = curl_multi_exec($mh, $running);
if($running){
curl_multi_select($mh);
}
$info = curl_multi_info_read($mh);
if ($info !== false) {
$i++;
if ($i % 10 === 0 && $i>0)
logTimeElapsed();
}
} while ($running && $status == CURLM_OK);
我主要从 here 复制代码。
我的命中测试非常不一致。它似乎只是有时工作。也许当我提出少量请求时。所以这个问题实际上可能与终点有关。如果是这样,我如何跟踪端点是否拒绝了我的请求?
My tests of hit has been strangly inconsistent
是啊,难怪。如果多个句柄在同一个 exec() 调用中完成,则代码中存在错误,您将只会读取第一个句柄的消息,其余句柄的消息将丢失! (编辑:但这不是你的错,错误来自你在 https://www.php.net/manual/en/function.curl-multi-info-read.php , someone should fix the docs!) (edit2: fixed the docs: https://github.com/php/doc-en/pull/102 的 copypasta)让我们说之前
$status = curl_multi_exec($mh, $running);
$运行ning为2,完成后$运行ning为0,则
$info = curl_multi_info_read($mh);
if ($info !== false) {
$i++;
if ($i % 10 === 0 && $i>0)
logTimeElapsed();
}
只会读取第一个消息,第2个句柄的消息将永远被忽略!您需要阅读所有消息,无论是 1 条消息还是 100 条消息,为此使用 while()
while(false!==($info=curl_multi_info_read($mh))){
然后将读取所有消息。你也应该从 $mh 中删除完成的句柄,所以添加
while(false!==($info=curl_multi_info_read($mh))){
curl_multi_remove_handle($mh,$info['handle']);
这样我们可以确保 curl_multi_exec() 不会尝试重新 运行 完成的句柄.. multi_exec 的 job/cpu 也会减少,因为它有一个较小的列表要迭代
另外,作为一个小的优化,您应该在阅读消息之后 curl_multi_select(),而不是在阅读消息之前,这样您的 cpu 将在等待网络时忙于处理消息 activity,而不是休眠直到有网络 activity,然后读取前一个 exec() 的消息,简单地说,如果你把 select() 放在 [=32] 之后,代码应该更快=](),之前没有。
我想知道在使用 curl_multi 时每个 curl 请求是什么时候发出的。
到目前为止我的代码:
$i = 0;
do {
$status = curl_multi_exec($mh, $running);
if($running){
curl_multi_select($mh);
}
$info = curl_multi_info_read($mh);
if ($info !== false) {
$i++;
if ($i % 10 === 0 && $i>0)
logTimeElapsed();
}
} while ($running && $status == CURLM_OK);
我主要从 here 复制代码。
我的命中测试非常不一致。它似乎只是有时工作。也许当我提出少量请求时。所以这个问题实际上可能与终点有关。如果是这样,我如何跟踪端点是否拒绝了我的请求?
My tests of hit has been strangly inconsistent
是啊,难怪。如果多个句柄在同一个 exec() 调用中完成,则代码中存在错误,您将只会读取第一个句柄的消息,其余句柄的消息将丢失! (编辑:但这不是你的错,错误来自你在 https://www.php.net/manual/en/function.curl-multi-info-read.php , someone should fix the docs!) (edit2: fixed the docs: https://github.com/php/doc-en/pull/102 的 copypasta)让我们说之前
$status = curl_multi_exec($mh, $running);
$运行ning为2,完成后$运行ning为0,则
$info = curl_multi_info_read($mh);
if ($info !== false) {
$i++;
if ($i % 10 === 0 && $i>0)
logTimeElapsed();
}
只会读取第一个消息,第2个句柄的消息将永远被忽略!您需要阅读所有消息,无论是 1 条消息还是 100 条消息,为此使用 while()
while(false!==($info=curl_multi_info_read($mh))){
然后将读取所有消息。你也应该从 $mh 中删除完成的句柄,所以添加
while(false!==($info=curl_multi_info_read($mh))){
curl_multi_remove_handle($mh,$info['handle']);
这样我们可以确保 curl_multi_exec() 不会尝试重新 运行 完成的句柄.. multi_exec 的 job/cpu 也会减少,因为它有一个较小的列表要迭代
另外,作为一个小的优化,您应该在阅读消息之后 curl_multi_select(),而不是在阅读消息之前,这样您的 cpu 将在等待网络时忙于处理消息 activity,而不是休眠直到有网络 activity,然后读取前一个 exec() 的消息,简单地说,如果你把 select() 放在 [=32] 之后,代码应该更快=](),之前没有。