我有一个节点websockets服务器都设置了聊天服务工作得很好.但我希望LAMP服务器能够向连接到websocket服务器的用户发送定期消息. (响应用户浏览器操作或cron作业).所以我需要一些PHP代码来向节点服务器发送请求(两者都在Google Compute Engine上).
我通过这个答案找到了:https://stackoverflow.com/a/22411059/947374
…一个论坛的链接,有人得到了这个很好的解决方案:https://forum.ripple.com/viewtopic.php?f=2&t=6171&p=43313#p43313
//local address of node server
$host='XXX.XXX.XXX.XXX';
$port=80;
//location where THIS script is running FROM
$local="http://localhost";
//json the data to send
$data=json_encode($data);
//some very particular headers
$head = "GET / HTTP/1.1"."\r\n".
"Upgrade: WebSocket"."\r\n".
"Connection: Upgrade"."\r\n".
"Origin: $local"."\r\n".
"Host: $host"."\r\n".
"Sec-WebSocket-Version: 13"."\r\n".
"Sec-WebSocket-Key: asdasdaas76da7sd6asd6as7d"."\r\n".
"Content-Length: ".strlen($data)."\r\n"."\r\n";
//WebSocket handshake
$sock = fsockopen($host, $port, $errno, $errstr, 2);
fwrite($sock, $head ) or die('error:'.$errno.':'.$errstr);
$headers = fread($sock, 2000);
//see the second link above for what hybi10Encode() is doing
fwrite($sock, hybi10Encode($data)) or die('error:'.$errno.':'.$errstr);
$wsdata = fread($sock, 2000);
fclose($sock);
数据从PHP发送到节点.美丽.赞美主.
唯一的问题是连接似乎保持打开约60秒.数据立即从PHP发送到节点,网络聊天就像我想要的那样立即响应.但是请求PHP脚本的浏览器选项卡会旋转60秒,并且在第一个完成之前不会再接受另一个请求.
我原以为包含fclose()会使得连接不会像这样保持打开状态.
我也尝试将标题更改为:
连接:关闭
和/或尝试过
GET / HTTP / 1.0
(根据具有类似问题的其他线程的一些建议)这也没有帮助.
关于如何让PHP脚本立即关闭连接或让节点服务器在处理完请求后立即从LAMP服务器中删除连接的任何建议?
解决方法:
你真的得到fclose()吗?
代码可能会被卡在fread()上,如果你有阻塞模式(http://php.net/manual/en/function.stream-set-blocking.php)并且不发送2000字节或eof-在其他词中,fread将会超时.
去测试:
– 把回声’关闭’;在fclose之前所以你知道你到了那里
– 添加stream_set_blocking($sock,false);
– 缩短套接字超时(http://php.net/manual/en/function.stream-set-timeout.php)
小警告:如果你设置非阻塞,你可能需要循环$headers = fread($sock,2000);因为即使没有数据,它也会立即返回.创建一个while循环,循环不亮你手动计时,或者你得到你期望的响应.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。