我需要对uClassify Sentiment分类器进行多个API调用以获得许多推文的情感。由于我有很多推文索引,只需使用cURL是不够的(完全索引228条推文需要将近2分钟)。curl_multi_exec():不是有效的cURL句柄资源
没有情感分析,索引几乎是瞬间的,所以问题肯定是由于大量的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_close()
之后的卷曲声明等。
任何帮助将不胜感激,谢谢!
哎呀我忘了把手柄打开!哇这解决了我的问题,现在索引只有20秒以下。大改进。非常感谢你! – jablesauce 2015-02-05 15:06:42
不客气:-) – Alex 2015-02-05 15:36:56