关于PHP的长连接
核心函数:
ignore_user_abort();//浏览器关闭,脚本还是运行,测试OK
set_time_limit(0);
sleep(2);
代码片段(后台):
public function xinda() { //ignore_user_abort(); set_time_limit(0); header("Connection: Keep-Alive"); header("Proxy-Connection: Keep-Alive"); echo str_pad('', 4096); ob_implicit_flush(true); while ($i <= 10) { $i++; clearstatcache(); //要制定的代码,以及输出 ob_flush(); flush(); sleep(2); } }
前端:
function xinda() { setTimeout(function() { $.getScript("?m=index&a=xinda"); }, 5000); }
前端和短连接最大的区别是执行一次,其他的都是服务器执行。减少客户端的请求量。
尝试过AJAX,30秒请求一次服务器,长期开着,十分消耗资源。1%的几率请求500错误。
遇到的问题:
1、Apache Win32环境下,进程会锁死(但是重新开页面,则不影响),Linux+Apache未测试。
2、关于flush();输出,如果WEB服务器启用gzip则是无效的,所以必须把WEB服务的GZIP关掉。
3、如果要执行的代码操作数据库,那么要考虑数据库的长连接问题。
4、ignore_user_abort();函数,浏览器关闭,脚本还是继续运行,测试OK的,用来执行计划任务不错。
但是以上都不是最佳的解决方案,最佳的解决方案使用:workerman,做聊天室/IM软件什么的,都杠杠的。