关于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软件什么的,都杠杠的。

