2

我想知道是否有一种方法可以curl通过已经打开的套接字来使用,例如,调整这个:

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>

使用curl_exec()而不是fgets($fp, 128)

(或者,任何其他方式一直curl()在同一个流上使用,我的目标是阅读 twitter 流 api)

谢谢

4

2 回答 2

2

这可能对您有用,因为您正在处理 Twitter Stream API

set_time_limit(0);
$ch = curl_init();
echo "<pre>";
curl_setopt($ch, CURLOPT_URL, "https://sitestream.twitter.com/2b/site.json");
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'cgets');
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_USERPWD, 'user:password');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 1000000);
curl_exec($ch);

function cgets($ch, $string) {
    $length = strlen($string);
    printf("Received %d byte\n", $length);
    flush();
    return $length;
}
于 2012-10-16T13:03:51.097 回答
0

没有办法强制 cURL 使用 PHP 中的现有套接字。虽然 cURL 在内部池化和重用连接,但不能强制它一直使用同一个连接,或者永远不要关闭它打开的连接。

您可以查看 Phirehose(这是流式 API 的 PHP 接口),或者如果这还不够好,请在Twitter 库列表上购物 - 很可能有人已经用 PHP 解决了您的问题并将其打包。

尽管如此,使用 PHP 的流 API 听起来还是很奇怪。这是在 Web 服务器上,还是在独立的长时间运行的脚本上?

于 2012-10-16T12:19:39.690 回答