我想不出一个更好的方式来标题,对不起。
我正在研究PHP IRC机器人。目前我正在使用while fgets(...
循环来监听数据和响应。
在我睡着的某个时刻,它实际上已“停顿”并停止获取数据,没有任何可用于触发重启的错误消息。
我想到了一个快速的解决方案,那就是存储服务器上次ping机器人的时间,如果超过x秒,则重新连接。这个计划在理论上很有效,除了这个ping检查是在while fgets循环中完成的,所以它只在从IRC服务器接收数据时检查它。因此,如果它只是停止从服务器获取数据,它将不会比较ping时间,也不会重新启动。
我想不出如何解决这个问题。帮助
答案 0 :(得分:3)
首先,使用stream_set_timeout()将(已打开的)套接字的超时设置为低于服务器ping超时的值。
然后将循环条件修改为:while(fgets(...) || !$done)
当你没有得到答案时,fgets会超时,你可能不得不取消警告。但是,通过这种方式,您可以向服务器发送内容,以便在您获得ping超时之前不会断开连接。只需修改$ done标志,并在真正想要断开连接时将其设置为true(不过你要这样做)。
不确定这是否有效,但它可能值得一试。
附录:我在考虑退出条件,手动退出while
(使用break
)而不是设置标志可能会更好。因此,您可以将条件修改为while(fgets(...) || 1)
。否则,当服务器不断发送内容时,您可能会陷入无限循环。