【问题标题】:curl through an already open socket通过已经打开的套接字卷曲
【发布时间】:2012-10-06 11:57:51
【问题描述】:

我想知道是否有办法通过已经打开的套接字使用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)

谢谢

【问题讨论】:

  • 除非你想把 curl 和 fgets 结合在一起
  • 不,cURL 有自己的内部套接字处理。你面临的真正问题是什么?为什么要为 cURL 启动一个套接字,而 cURL 本身可以做得很好?你想解决什么问题?
  • Twitter 流 api 强制客户端使用单个连接并“永远”留在那里听,所以我需要 curl() 始终使用相同的连接,而不是连接/读取/断开连接。另外,我想要 curl 而不是 fwrite($fp, $out),因为我使用了一个使用 curl 和 OAuth 的类,这是 Twitter API 所需要的
  • 如果你愿意,我可以举个例子

标签: php sockets curl


【解决方案1】:

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

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

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

【讨论】:

  • 它在一个网络服务器中,也许它会进入一个 cron 脚本
【解决方案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;
}

【讨论】:

  • 但是我使用的是 1.1 版的 api,所以我需要 OAuth,另外,应该有一个 infinite 循环 somwhere
猜你喜欢
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多