使用cURL输出

问题描述:

我正计划在特定主题上记录实时推文。同样,我在PHP中使用带cURL的twitter流API。使用cURL输出

下面是代码:

<?php 

$username = "xxxxx"; 
$password = "xxxxx"; 


$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, 'https://stream.twitter.com/1/statuses/filter.json?   track=SEARCH_PARAMETER'); 
curl_setopt($ch, CURLOPT_USERPWD, $username.":".$password); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
$result = curl_exec($ch); 
$jsonOBJ = json_decode ($result); 

curl_close($ch); 

print_r($jsonOBJ); 
?> 

我的问题是,如果我CURLOPT_RETURNTRANSFER设置为0,我可以看到在终端上的tweet。但是我不能存储变量$ jsonOBJ并打印它。

请帮忙!

+0

不会是更容易使用和SDK使用OAuth PHP? – chepe263 2012-04-26 17:01:16

+0

打印出$结果,在尝试对其进行解码之前查看它的外观。 – MrCode 2012-04-26 17:02:43

+0

现在,我直接做这个“echo $ result;”。 但是在执行这个脚本时什么也没有显示出来。 – Gooner 2012-04-26 17:15:08

我工作在这样的事情,以及:)问题是,当你在终端做,这是一个流,所以直到你杀它的连接保持活跃。 (即curl_exec()未完成)

试着看一下CURLOPT_PROGRESSFUNCTION和CURLOPT_READFUNCTION。他们可能会给你一些提示。

+0

我已经加入 “curl_setopt($ CH,CURLOPT_TIMEOUT,30);”杀死curl_exec()。但是仍然没有数据存储在变量中。 – Gooner 2012-04-26 17:44:56

+0

在那30秒内有推文吗? – 2012-04-26 17:54:31

+0

是的。我可以通过将它打印到终端上来看到它们。 – Gooner 2012-04-26 18:12:32

我只是冲你一个答案,离开的那一天。这看起来应该起作用。

下面是我使用的功能,我将它传递一个URL和一些XML数据并返回一个关联数组说真的还是假的成功和retuen值作为一个字符串。

function do_curl($url, $data) 
    { 
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    $result = curl_exec ($ch); 

    $curl_return=array(); 

    if (!is_string($result)) 
     { 
     $curl_return['STATUS'] = FALSE; 
     $curl_return['ERRMSG'] = curl_error($ch); 
     } 
    else 
     { 
     $curl_return['STATUS'] = TRUE; 
     $curl_return['RESPONSE'] = $result; 
     } 
    curl_close($ch); 
    return $curl_return; 
    } 

UPDATE:见新代码在邮件的末尾,这实际上是很容易做到,但卷曲我去它正确的第一次。

我无法使用cURL与CURLOPT_READFUNCTION结合使用Twitter流API,但使用fsockopen()fread()已成功。我不确定为什么readfunction不能正常工作,因为我以前用它成功了,但它必须与响应数据是“流式传输”并不是使用HTTP分块编码发送的事实有关。从本质上讲,我的阅读功能从未被调用,所以我无法处理数据。

我使用的方法是现在工作:使用数据流使用fputs

  • 消耗HTTP响应头,并确保有的fsockopen到ssl://stream.twitter.com
  • 问题的基本的HTTP请求

    • 连接没有错误
    • 在无限循环中使用fread读取金额数据
    • 每次读取一块数据时,我称内部缓冲器功能
    • 缓冲功能追加新数据到缓冲器
    • 缓冲功能然后尝试处理缓冲区中的所有消息(如果我们有1个或多个完整的消息)
    • 由于它处理的每个消息缓冲区被减少,直至为空,则函数返回和数据再次读

    我已经受够了运行了几个小时了,还没有被丢弃的连接,我已经处理了超过30,000条消息,并且没有错误。

    基本上我实现了一个回调系统,以便每次从缓冲区中读取完整消息时,它会使用json消息调用用户定义的回调函数,以便应用程序可以执行任何需要处理的消息(例如insert到数据库)。

    我没有任何的简短摘要现在还没有发布,但如果你想,通过将我的个人资料中列出的网站,并在接触填写表格,我很乐意分享我发短信。如果有人感兴趣,也许我们可以一起工作。我只是为了好玩而做了这些,我对Twitter没有兴趣,并且没有因为经济原因而使用它。也许最终我会把它放在GitHub上。

    编辑:

    下面是一些卷曲的代码,将连接到流API并通过JSON消息的回调函数,因为他们都可用。本示例使用gzip编码来节省带宽。

    <?php 
    
    $USERNAME = 'youruser'; 
    $PASSWORD = 'yourpass'; 
    $QUERY = 'nike'; 
    
    /** 
    * Called every time a chunk of data is read, this will be a json encoded message 
    * 
    * @param resource $handle The curl handle 
    * @param string $data The data chunk (json message) 
    */ 
    function writeCallback($handle, $data) 
    { 
        /* 
        echo "-----------------------------------------------------------\n"; 
        echo $data; 
        echo "-----------------------------------------------------------\n"; 
        */ 
    
        $json = json_decode($data); 
        if (isset($json->user) && isset($json->text)) { 
         echo "@{$json->user->screen_name}: {$json->text}\n\n"; 
        } 
    
        return strlen($data); 
    } 
    
    $ch = curl_init(); 
    
    curl_setopt($ch, CURLOPT_URL, 'https://stream.twitter.com/1/statuses/filter.json?track=' . urlencode($QUERY)); 
    curl_setopt($ch, CURLOPT_USERPWD, "$USERNAME:$PASSWORD"); 
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'writeCallback'); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 20); // disconnect after 20 seconds for testing 
    curl_setopt($ch, CURLOPT_VERBOSE, 1); // debugging 
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); // req'd to get gzip 
    curl_setopt($ch, CURLOPT_USERAGENT, 'tstreamer/1.0'); // req'd to get gzip 
    
    curl_exec($ch); // commence streaming 
    
    $info = curl_getinfo($ch); 
    
    var_dump($info); 
    
  • +0

    非常感谢您的建议。 现在,我通过使用搜索Twitter API找到了解决办法。 当我再次使用流媒体API时,我一定会与您联系。 – Gooner 2012-04-27 16:14:51

    +0

    @Rubie_Newbie我使用cURL添加了一个流API的工作示例。我在C#中也有一个工作版本。这个php类[phirehose](https://github.com/fennb/phirehose/)也可能对你感兴趣,虽然它不支持gzip。 – drew010 2012-04-29 17:51:33

    @Reza Sanaie和其他人可能会觉得这有帮助。

    我用搜索Twitter API和获取实时的鸣叫也是如此。所以这可能会有所帮助。 下面是代码:

    <?php 
    $query = "SEARCH_PARAMETER"; 
    $request = "http://search.twitter.com/search.json?q=".urlencode($query); 
    $response = file_get_contents($request); 
    $jsonobj = json_decode($response); 
    print_r($jsonobj); 
    ?> 
    

    我也有MySQL连接设置将其推到数据库中,这个脚本在crontab中加入自动完成整个过程。