天天看點

聊聊php定時計劃任務

google百度了下,PHP任務大體上可以分為三類

1、伺服器計劃任務

WIN伺服器可以直接使用定時任務執行相關的應用程式,LINUX伺服器則可以通過在/etc/crontab裡添加定時任務來實作。

2、通過死循環實作任務自動執行

建立一個程式檔案頁面,通過ignore_user_abort來設定關閉浏覽器頁面後仍可執行,那麼,在運作該程式頁面後,您所需要的任務計劃便會一直自動執行。對于一般的PHP程式員來說,如果沒有足夠的把握,這種操作是不被允許的,因為死循環極容易使用伺服器當機。

3、觸發式定時任務

在我所了解的幾套程式中,像Discuz、帝國CMS等等,均使用這種方式來完成系統的定時任務,相對前面的兩種方法,這是最為安全和簡單的。

Discuz:

在您設定的計劃任務執行時刻,如果有人通路您的站點,計劃任務才會執行;如果那個時刻沒有人通路您的站點,一直到有人通路時才執行計劃任務。

定時任務對于php來說一直都是很多朋友的一個難題,但卻很多地方都遇到了。

比如說:

遊戲開發程式中,每隔10分鐘給玩家發兵一次

sns社群中每隔20秒檢測一下是否有人給我發消息

自動采集程式,每隔5分鐘采集一次最新内容

微網誌資料同步,每隔10個小時通過微網誌api接口同步一次使用者資料

……

大概有那麼幾種方法:

1.Linux系統

定時直接可以用cron來執行一個php腳本 或者其他語言的腳本[你要有足夠的系統權限]

執行編輯cron指令

<code>crontab</code><code>-e</code>

比如每隔5分鐘執行下 /root/bin目錄下的test.php腳本

*/5 * * * * php /root/bin/test.php

2.windows系統

可用計劃任務執行腳本,不舉例

PHP的實作決定了它沒有Java和.Net這種AppServer的概念, 而http協定是一個無狀态的協定, php隻能被使用者觸發, 被調用, 調用後會自動退出記憶體, 沒有常駐記憶體, 就沒有辦法準确的定時處理

那麼, 如果需要用PHP定時執行某些任務的話, 可以有以下幾個方法:

1、Linux下crontab, windows下計劃任務

2、找個被頻繁調用的網頁, 裡面加上一個檢測代碼

3、set_time_limit(0);

ignore_user_abort(true);

死循環

第一種:方法是最常見的, 但也是最靠譜的,如果php伺服器上沒有權限去crontab, 也可以找一個自己的機器定期crontab去請求伺服器

第二種:方法, 論壇上定時清理新帖基本上就是這麼實作的, 如果人氣不旺的話, 可以考慮去别的火爆點的論壇裡面發個圖檔, 調用自己的php來實作一個trigger就好了。 Discuz!是判斷在00:00之後,第一個執行者去執行的。

第三種:最不靠譜, Apache重新開機了就得重新通路,  fastcgi倒是會好一點。

網上參考:

<a href="http://blog.163.com/zbstrive_work@126/blog/static/165378687201141143512114/" target="_blank">http://blog.163.com/zbstrive_work@126/blog/static/165378687201141143512114/</a>

      本文轉自許琴 51CTO部落格,原文連結:http://blog.51cto.com/xuqin/1369169,如需轉載請自行聯系原作者