聊聊php定時計劃任務

技術小胖子發表於2017-11-16

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命令

1
crontab-e

比如每隔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倒是會好一點。




網上參考:

http://blog.163.com/zbstrive_work@126/blog/static/165378687201141143512114/



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




相關文章