好吧,我正在尝试重复使用我在初始过程中产生的句柄,但是在第一次运行后它只是停止工作。如果我删除(或重新创建整个处理程序)句柄并再次添加它,它工作正常。可能是罪魁祸首?
我的代码目前看起来像这样:
<?php
echo 'Handler amount: ';
$threads = (int) trim(fgets(STDIN));
if($threads < 1) {
$threads = 1;
}
$s = microtime(true);
$url = 'http://mywebsite.com/some-script.php';
$mh = curl_multi_init();
$ch = array();
for($i = 0; $i < $threads; $i++) {
$ch[$i] = curl_init($url);
curl_setopt_array($ch[$i], array(
CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20130213 Firefox/21.0',
CURLOPT_REFERER => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_NOBODY => true
));
curl_multi_add_handle($mh, $ch[$i]);
}
while($mh) {
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
$e = microtime(true);
$totalTime = number_format($e - $s, 2);
if($totalTime >= 1) {
echo floor($threads / $totalTime) . ' requests per second (total time '.$totalTime.'s)' . "\r";
$s = microtime(true);
}
}
foreach($ch as $handler) {
curl_multi_remove_handle($mh, $handler);
curl_close($handler);
}
curl_multi_close($mh);
?>
当CURLOPT_VERBOSE
设置为true
时,我看到很多&#34;其他内容不精确transfer.c:1037:0 0&#34;消息,我在另一个问题上读到了它们,似乎它是由一些显而易见的事情引起的:
太快
防火墙
ISP限制
AFAIK,不是这样,因为如果我每次都重新创建句柄,它们会以每秒约79个请求成功完成(每个约529个字节)
我重复使用句柄的过程:
创建多处理程序,并将指定数量的句柄添加到多处理程序
当mutli处理程序正在运行时,执行所有句柄
在while循环停止后(似乎不太可能),关闭所有句柄和多卷曲处理程序
它执行一次所有句柄然后停止。
这真的让我很难过。有任何想法吗?
答案 0 :(得分:1)
我遇到了同样的问题(虽然使用C ++),但发现我需要移除curl easy句柄,然后再次将其重新添加。我的解决方案是在curl_multi_perform循环的末尾删除所有句柄,然后将它们重新添加到外部循环的开头,在该循环中,我将重用现有的保持活动连接:
for(;;) // loop using keep-alive connections
{
curl_multi_add_handle(...)
while ( stillRunning ) // curl_multi_perform loop
{
...
curl_multi_perform(...)
...
}
curl_multi_remove_handle(...)
}
也许这也适用于您的PHP方案。请记住:不要curl_easy_cleanup
或curl_easy_init
之间的卷曲柄。
如果打开CURLOPT_VERBOSE,则可以在控制台中进行操作,非常确实可以重用您的连接。那为我解决了这个问题。