Php 卷曲通过一个已经打开的插座

Php 卷曲通过一个已经打开的插座,php,sockets,curl,Php,Sockets,Curl,我想知道是否有一种方法可以在一个已经打开的套接字上使用curltr,比如,修改以下内容: <?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

我想知道是否有一种方法可以在一个已经打开的套接字上使用
curl
tr,比如,修改以下内容:

<?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\u exec()
代替
fgets($fp,128)

(或者,如果要一直在同一个流上使用
curl()
,我的目标是阅读twitter流api)


谢谢

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

您可以签出(这是流式API的一个PHP接口),或者如果这还不够好,可以在列表上进行一些购买-很可能有人已经用PHP解决了您的问题并将其打包


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

这可能适合您,因为您正在处理Twitter流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;
}
设置时间限制(0);
$ch=curl_init();
回声“;
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_超时,1000000);
curl_exec($ch);
函数cgets($ch,$string){
$length=strlen($string);
printf(“接收到%d字节\n”,$length);
冲洗();
返回$length;
}

除了要将curl和
fgets组合在一起之外,curl有自己的内部套接字处理。你面临的真正问题是什么?为什么要为cURL启动一个套接字,而cURL本身可以很好地完成这项工作?你想解决什么问题?Twitter stream api强制客户端使用单个连接,并“永远”在那里监听,因此我需要curl()始终使用相同的连接,而不是连接/读取/断开连接。另外,我希望使用curl而不是fwrite($fp,$out),因为我使用了一个使用curl和OAuth的类,我需要TwitterAPI。如果你愿意,我可以举个例子,但我使用的是API的1.1版,所以我需要OAuth,另外,应该有一个无限循环,它在Web服务器中,也许它会在cron脚本中