2015-02-05 92 views
2

我需要对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()之后的卷曲声明等。

任何帮助将不胜感激,谢谢!

回答

2

所以如果你需要这些手柄,你为什么要关闭它们?

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); 

} 
+0

哎呀我忘了把手柄打开!哇这解决了我的问题,现在索引只有20秒以下。大改进。非常感谢你! – jablesauce 2015-02-05 15:06:42

+0

不客气:-) – Alex 2015-02-05 15:36:56

相关问题