最近开发有这样的需求,但php又不擅长处理多进程任务,顾尝试找一些解决方案。
我知道的方法可能可以用的有一下几种:
1,可以用Linux crob定时任务+php脚步似乎可以实现,但如果用户比较多的话,也
不怎么好 处理。
2,另外就是ignore_user_abort();//函数,连接断开后可以继续执行,但来做多用户在线离线,好像还是有问题的。网上流行的一段代码就是:
<?php
ignore_user_abort();
//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(3000);
// 通过set_time_limit(0)可以让程序无限制的执行下去
$interval
=5;
// 每隔5s运行
//方法1--死循环
do
{
echo
'测试'
.time().
'<br/>'
;
sleep(
$interval
);
// 等待5s
}
while
(true);
//方法2---sleep 定时执行
require_once
'./curlClass.php'
;
//引入文件
$curl
=
new
httpCurl();
//实例化
$stime
=
$curl
->getmicrotime();
for
(
$i
=0;
$i
<=10;
$i
++){
echo
'测试'
.time().
'<br/>'
;
sleep(
$interval
);
// 等待5s
}
ob_flush();
flush
();
$etime
=
$curl
->getmicrotime();
echo
'<hr>'
;
echo
round
((
$etime
-stime),4);
//程序执行时间
3,通过session机制,应该也可以,但如果是手机的话,session就有点尴尬了。
4,还有就是可以通过别的语言来实现,数据库共享就可以,反正都是自己开发。c++首选,但不到万不得已,也不愿意在php项目中去再用c++开发一个东西,会被那些人喷死的。
最后网上找了下,感觉下面这个方案应该还可以,基本不存在什么原理性的问题,手机终端和浏览器通用,欢迎大家一起研究讨论:
因为登陆可以统计,但是人家不退出登陆,而是直接关闭浏览器,你这程序还会继续认为他在线。
简单的方法是用文件来存储,
用户登录的时候,生成一个缓存文件,比如当前用户的id为10,
那么,生成的文件的名称为 $fileName = ‘10_’.tme()+600;
后面的部分是到期时间,默认是10分钟以后过期,
当用户访问的时候,你通过glob函数,找出这个文件,删除,然后生成一个新的文件,文件是当前时间后推10分钟。用户如果退出登录,就直接删除这个文件。
也就是说,用户操作一次,这个文件的时间就刷新一次。
统计的时候只要遍历所以文件,找出所有到期时间大于当前时间的文件的数量即可,此方法不仅可以统计,也可以列举出在线的都是谁。
时间不一定是10分钟,可以任意取,也就是超过多少时间无动作就默认当作下线。
文件存储地址可以用hash分组。