curl_multi_exec():不是有效的cURL句柄资源

时间:2015-02-05 14:49:04

标签: php curl twitter

我需要对uClassify Sentiment分类器进行多次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()等之后发生的任何卷曲声明。

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分: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 );

}