curl_multi_exec(): 不是有效的 cURL 句柄资源
curl_multi_exec(): is not a valid cURL handle resource
我需要对 uClassify 情绪分类器进行多次 API 调用,以获取大量推文的情绪。由于我有很多推文需要索引,仅使用 cURL 是不够的(完全索引大约 228 条推文需要将近 2 分钟)。
如果没有情绪分析,索引几乎是瞬时的,所以问题肯定是由于 API 调用次数过多造成的。
我考虑过使用 curl_multi_init
。每当进行 API 调用时,都会调用 curl_init()
,而不是处理调用,句柄将添加到 curl_multi
。添加所有句柄后,我使用 curl_multi_exec()
函数处理所有句柄。
这是我的应用程序的简化版本,仅显示情绪部分:
$mh = curl_multi_init ();
foreach ($tweets as $tweet){
getSentiment ( $tweet, $mh );
}
executeHandles($mh);
function getSentiment($tweet, $mh) {
$tweet = str_replace ( ' ', '+', $tweet );
$prefix = 'http://uclassify.com/browse/uClassify/Sentiment/ClassifyText?';
$key = 'readkey=' . CLASSIFY_KEY . '&';
$text = 'text=' . $tweet . '&';
$version = 'version=1.01';
$url = $prefix . $key . $text . $version;
// $xml = getXML($url, $mh);
addHandle ( $url, $mh );
// $xml = file_get_contents($url, false, $context); ---- TOO SLOWh
// $mood = parseSentiment($xml);
// return $mood;
}
function addHandle($url, $mh) {
$ch = curl_init ();
$timeout = 5;
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_multi_add_handle ( $mh, $ch );
// $xml = curl_exec($ch);
curl_close ( $ch );
// return $xml;
}
function executeHandles($mh) {
if (! empty ( $mh )) {
$active = null;
// execute the handles
do {
$mrc = curl_multi_exec ( $mh, $active );
} while ( $mrc == CURLM_CALL_MULTI_PERFORM );
while ( $active && $mrc == CURLM_OK ) {
if (curl_multi_select ( $mh ) == - 1) {
usleep ( 100 );
}
do {
$mrc = curl_multi_exec ( $mh, $active );
} while ( $mrc == CURLM_CALL_MULTI_PERFORM );
}
}
}
这是回归
curl_multi_exec(): 12 is not a valid cURL handle resource in C:\xampp\htdocs\Twitter\twitteroauth-master\index.php on line 299
这是指这行代码:
$mrc = curl_multi_exec ( $mh, $active );
这只是我第一次使用 cURL,所以我不确定我是否遗漏了一些重要的细节。我不明白为什么会发生此错误,我没有在 curl_close()
等
之后发生任何 curl 语句
任何帮助将不胜感激,谢谢!
如果您需要这些句柄,为什么要关闭它们?
function addHandle($url, $mh) {
$ch = curl_init ();
$timeout = 5;
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_multi_add_handle ( $mh, $ch );
}
我需要对 uClassify 情绪分类器进行多次 API 调用,以获取大量推文的情绪。由于我有很多推文需要索引,仅使用 cURL 是不够的(完全索引大约 228 条推文需要将近 2 分钟)。
如果没有情绪分析,索引几乎是瞬时的,所以问题肯定是由于 API 调用次数过多造成的。
我考虑过使用 curl_multi_init
。每当进行 API 调用时,都会调用 curl_init()
,而不是处理调用,句柄将添加到 curl_multi
。添加所有句柄后,我使用 curl_multi_exec()
函数处理所有句柄。
这是我的应用程序的简化版本,仅显示情绪部分:
$mh = curl_multi_init ();
foreach ($tweets as $tweet){
getSentiment ( $tweet, $mh );
}
executeHandles($mh);
function getSentiment($tweet, $mh) {
$tweet = str_replace ( ' ', '+', $tweet );
$prefix = 'http://uclassify.com/browse/uClassify/Sentiment/ClassifyText?';
$key = 'readkey=' . CLASSIFY_KEY . '&';
$text = 'text=' . $tweet . '&';
$version = 'version=1.01';
$url = $prefix . $key . $text . $version;
// $xml = getXML($url, $mh);
addHandle ( $url, $mh );
// $xml = file_get_contents($url, false, $context); ---- TOO SLOWh
// $mood = parseSentiment($xml);
// return $mood;
}
function addHandle($url, $mh) {
$ch = curl_init ();
$timeout = 5;
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_multi_add_handle ( $mh, $ch );
// $xml = curl_exec($ch);
curl_close ( $ch );
// return $xml;
}
function executeHandles($mh) {
if (! empty ( $mh )) {
$active = null;
// execute the handles
do {
$mrc = curl_multi_exec ( $mh, $active );
} while ( $mrc == CURLM_CALL_MULTI_PERFORM );
while ( $active && $mrc == CURLM_OK ) {
if (curl_multi_select ( $mh ) == - 1) {
usleep ( 100 );
}
do {
$mrc = curl_multi_exec ( $mh, $active );
} while ( $mrc == CURLM_CALL_MULTI_PERFORM );
}
}
}
这是回归
curl_multi_exec(): 12 is not a valid cURL handle resource in C:\xampp\htdocs\Twitter\twitteroauth-master\index.php on line 299
这是指这行代码:
$mrc = curl_multi_exec ( $mh, $active );
这只是我第一次使用 cURL,所以我不确定我是否遗漏了一些重要的细节。我不明白为什么会发生此错误,我没有在 curl_close()
等
任何帮助将不胜感激,谢谢!
如果您需要这些句柄,为什么要关闭它们?
function addHandle($url, $mh) {
$ch = curl_init ();
$timeout = 5;
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_multi_add_handle ( $mh, $ch );
}