如何在php中使用curl从服务器获得响应

时间:2018-04-16 15:07:42

标签: php curl tcp

我正在使用CURL从服务器获取数据。它的工作方式如下:

  • 设备将数据发送到服务器上的路由应用程序。
  • 要从路由应用程序获取数据,客户端必须使用GET方法询问服务器地址,端口和参数。
  • 一旦连接了客户端,应用程序就会开始在从设备到达连接的客户端的每个新数据包上发送数据。见下图

enter image description here

现在让我们看看我运行的代码来获取响应:

<?php
   $curl = curl_init('http://192.168.1.4/online?user=dneb'); 
   curl_setopt($curl, CURLOPT_PORT, 1818); 
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
   $result = curl_exec($curl);
   curl_close($curl);
   echo $result;

通过此CURL请求,我可以从路由应用程序获取响应数据。但是路由应用程序永远不会停止向连接的客户端发送数据,因此只有在我关闭路由应用程序时才会得到结果,它会将每个数据作为一个回显。现在我的问题是如何在不关闭路由应用程序关闭连接或连接的情况下回显每个数据?即收到数据时,无条件地显示数据。您可以建议使用TCP将此数据转发到另一台服务器的任何其他选项。谢谢!

1 个答案:

答案 0 :(得分:1)

一个永不关闭的http连接?不要以为php的卷曲绑定适合于此。但你可以使用socket api,

$sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_set_block($sock);
socket_connect($sock,"192.168.1.4",1818);
$data=implode("\r\n",array(
'GET /online?user=dneb HTTP/1.0',
'Host: 192.168.1.4',
'User-Agent: PHP/'.PHP_VERSION,
'Accept: */*'
))."\r\n\r\n";
socket_write($sock,$data);
while(false!==($read_last=socket_read($sock,1))){
   // do whatever
    echo $read_last;
}
var_dump("socket_read returned false, probably means the connection was closed.",
"socket_last_error: ",
socket_last_error($sock),
"socket_strerror: ",
socket_strerror(socket_last_error($sock))
);
socket_close($sock);

或者甚至可能是http fopen,

$fp=fopen("http://192.168.1.4:1818/online?user=dneb","rb");
stream_set_blocking($fp,1);
while(false!==($read_last=fread($fp,1))){
// do whatever
    echo $read_last;
}
var_dump("fread returned false, probably means the connection was closed, last error: ",error_get_last());
fclose($fp);

(如果fopen可以使用80以外的其他端口,则idk。如果你在php.ini中禁用allow_url_fopen,这也不会起作用)