定時任務對於php來說一直都是很多朋友的一個難題,但卻很多地方都遇到了。
比如說:
游戲開發程序中,每隔10分鍾給玩家發兵一次
sns社區中每隔20秒檢測一下是否有人給我發消息
自動采集程序,每隔5分鍾采集一次最新內容
微博數據同步,每隔10個小時通過微博api接口同步一次用戶數據
……
大概有那么幾種方法:
1.Linux系統
定時直接可以用cron來執行一個php腳本 或者其他語言的腳本[你要有足夠的系統權限]
執行編輯cron命令
1
|
crontab
-e
|
比如每隔5分鍾執行下 /root/bin目錄下的test.php腳本
*/5 * * * * php /root/bin/test.php
2.windows系統
可用計划任務執行腳本,不舉例
3.如果沒有系統權限,那就往下看吧。
由於php屬於解釋型弱語言,所以做定時任務的時候不會像java那樣容易,在java中直接給個進程就可以讓系統執行定時任務,但是在php中沒那么簡單 設置都沒有多線程的概念。
我第一次接觸定時任務的時候是一個做php的朋友問我怎么實現定時發兵,我當時給出的答案是寫一個包含文件,每次都執行的時候都調用這個文件檢查是否有任務,但試想 如果沒人觸發怎么辦,顯然答案並不完美。
后來我又通過其他渠道獲得了解決的最佳辦法,而且我還親自做了測試。
大致理念就是設定關閉瀏覽器程序也會停留在服務器內存中執行,並且相應時間永不過期
看程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
ignore_user_abort(TRUE);
// 設定關閉瀏覽器也執行程序
set_time_limit(0);
// 設定響應時間不限制,默認為30秒
$count
= 0;
while
(TRUE)
{
sleep(5);
// 每5秒鍾執行一次
// 寫文件操作開始
$fp
=
fopen
(
"test"
.
$count
.
".txt"
,
"w"
);
if
(
$fp
)
{
for
(
$i
=0;
$i
<5;
$i
++)
{
$flag
=fwrite(
$fp
,
$i
.
"這里是文件內容www.xxtime.comrn"
);
if
(!
$flag
)
{
echo
"寫入文件失敗"
;
break
;
}
}
}
fclose(
$fp
);
// 寫文件操作結束
$count
++;
// 設定定時任務終止條件
if
(
file_exists
(
'lock.txt'
))
{
break
;
}
}
|
把這個文件命名為 tast.php 放在網站根目錄
如: www.xxtime.com/tast.php
訪問此網頁。此程序會再網站根目錄不斷生成名為test0.txt,test1.txt,test2.txt…的文本文件
訪問后可關閉瀏覽器,不影響程序繼續執行,如想阻止程序,請在網站根目錄下放一個名為lock.txt的文件。
如:www.xxtime.com/lock.txt
當然重新啟動服務器或者重啟電腦也可以阻止程序繼續運行
相關內容:
windows的schtasks定時任務:http://www.cnblogs.com/lostyue/archive/2011/10/24/2223166.html
Cron服務是SAE為開發者提供的分布式定時服務:http://sae.sina.com.cn/?m=devcenter&catId=195
另外標記一個php調用命令備份mysql的文章http://www.iteye.com/problems/90027