我开始使用
JavaScript EventSource对象在HTML5中使用push.我对PHP的工作解决方案非常满意:
$time = 0; while(true) { if(connection_status() != CONNECTION_NORMAL) { MysqL_close() break; } $result = MysqL_query("SELECT `id` FROM `table` WHERE UNIX_TIMESTAMP(`lastUpdate`) > '".$time."'"); while($row = MysqL_fetch_array($result)) { echo "data:".$row["id"].PHP_EOL; echo PHP_EOL; ob_flush(); flush(); } $time = time(); sleep(1); }
但突然间我的WebApp再也无法访问MysqL错误“连接太多”.
事实证明,在JavaScript中关闭事件源后,MysqL连接没有关闭:
window.onload = function() { sse = new EventSource("push.PHP"); sse.onmessage = function(event) { console.log(event.data.split(":")[1]); } } window.onbeforeunload = function() { sse.close(); }
所以我想PHP脚本不会停止执行.有没有办法在客户端连接断开连接之前调用函数(如die();)?为什么我的脚本在调用.close()后没有终止;在EventSource上?!
感谢帮助! –
首先:当您将代码包装在一个巨大的while(true)循环中时,您的脚本将永远不会终止.当脚本“用尽代码执行”时,与DB的连接将被关闭,但由于你已经编写了一个死锁,这种情况不会发生……永远不会发生.它不是一个EventSource问题,只是做了什么它应该这样做.老实说,真的,可悲的是你的错.
问题是:用户连接到您的站点,并实例化EventSource对象.建立与服务器的连接,并请求push.PHP的返回值.您的服务器按照要求执行,并运行脚本,即-again-只是一个死锁.没有错误,只要PHP.ini允许它运行,它就可以继续运行. .close()方法确实取消了输出流(或者更确切地说它应该),但是你的脚本忙于执行无限循环或休眠.假设由于客户端断开连接而停止脚本就像假设任何客户端可能干扰服务器的操作一样.在安全方面,这将是可能发生的最坏情况.现在,回答你的实际问题:问题的原因,如何解决?答案:HEADERS
查看this little PHP example:脚本不是在服务器端保持活动(通过无限循环),而是通过设置正确的标头.
正如旁注:请尽快抛弃MysqL_ *,它已被弃用(最后),使用PDO或MysqLi_ * istead.老实说,这并不难.