我正在使用CURL从服务器获取数据。它的工作方式如下:
现在让我们看看我运行的代码来获取响应:
<?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将此数据转发到另一台服务器的任何其他选项。谢谢!
答案 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
,这也不会起作用)