gpt4 book ai didi

php - fsockopen 连接保持打开状态

转载 作者:可可西里 更新时间:2023-11-01 00:29:34 24 4
gpt4 key购买 nike

我有一个 Node websockets 服务器,所有设置都带有运行良好的聊天服务。但我希望 LAMP 服务器能够定期向连接到 websocket 服务器的用户发送消息。 (响应用户浏览器操作或 cron 作业)。所以我需要一些 PHP 代码来向 Node 服务器发送请求(都在 Google Compute Engine 上)。

我通过这个答案找到:https://stackoverflow.com/a/22411059/947374...指向论坛的链接,有人在其中很好地解决了这个问题:https://forum.ripple.com/viewtopic.php?f=2&t=6171&p=43313#p43313

我的 PHP 代码现在看起来像:

//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 发送到 Node 。美丽的。赞美主。

唯一的问题是连接似乎保持打开状态大约 60 秒。数据立即从 PHP 发送到 Node ,网络聊天立即响应,就像我想要的那样。但是请求 PHP 脚本的浏览器选项卡会旋转 60 秒,并且在第一个请求完成之前不会接受另一个请求。

我原以为包含 fclose() 会使连接不会像这样保持打开状态。

我还尝试将 header 更改为:连接:关闭和/或尝试过获取/HTTP/1.0(根据具有类似问题的其他线程的一些建议)这也没有帮助。

关于如何让 PHP 脚本立即关闭连接或让 Node 服务器在处理完请求后立即断开与 LAMP 服务器的连接,有什么建议吗?

最佳答案

你真的到达了fclose()吗?

如果代码处于阻塞模式 (http://php.net/manual/en/function.stream-set-blocking.php) 并且不发送 2000 字节或 eof - 换句话说,代码可能会卡在 fread() 上fread 会超时。

测试: - 把 echo 'Closing'; 放在 fclose 之前,这样你就知道你到了那里 - 添加 stream_set_blocking ($sock, false); - 缩短套接字超时(http://php.net/manual/en/function.stream-set-timeout.php)

小警告:如果你设置了非阻塞,你可能需要循环 $headers = fread($sock, 2000); 因为它会立即返回,即使没有数据存在。创建一个 while 循环,它会一直循环直到您手动超时,否则您会得到预期的响应。

关于php - fsockopen 连接保持打开状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41706204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com