我正在开发 PHP IRC 机器人。目前我正在使用while fgets(...
循环以使其监听数据并响应。
在我睡着的某个时刻,它实际上“ping出去”并停止获取数据,没有任何类型的错误消息可以用来触发重新启动。
我想到了一个快速解决方案,那就是存储服务器上次 ping 机器人的时间,如果超过 x 秒,则重新连接。这个计划在理论上工作得很好,除了这个 ping 检查是在 while fgets 循环内完成的,所以它只在从 IRC 服务器接收到数据时才检查它。因此,如果它只是停止从服务器获取数据,它不会比较 ping 时间,也不会重新启动。
我想不出如何解决这个问题。
最佳答案
首先,使用stream_set_timeout()将(已打开的)套接字的超时设置为低于服务器 ping 超时的值。
然后将循环条件修改为:while(fgets(...) || !$done)
当您没有得到答案时, fgets 将超时,您可能必须为此取消警告。但是,通过这种方式,您可以向服务器发送一些内容,这样它就不会在 ping 超时之前断开您的连接。当您确实想要断开连接时(无论您正在这样做),只需修改 $done 标志并将其设置为 true 即可。
不确定这是否有效,但可能值得一试。
附录:我正在考虑退出条件,最好手动退出 while
(使用 break
)而不是设置标志。因此,您可以将条件修改为 while(fgets(...) || 1)
。否则,当服务器不断发送内容时,您可能会陷入无限循环。
关于php - 如何让我的脚本不断检查变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4806638/