最近開發有這樣的需求,但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分組。