1. 程式人生 > >PHP實現執行定時任務的linux思路詳解

PHP實現執行定時任務的linux思路詳解

由於公司需要定時對淘寶店家的資訊進行獲取並更新資料庫

所以需要定時執行任務。

PHP本身是沒有定時功能的,PHP也不能多執行緒。PHP的定時任務功能必須通過和其他工具結合才能實現,例如WordPress內建了wp-cron的功能,很厲害。本文,我們就來解析幾種常見的php定時任務的思路。

研究網路上通用的幾種方法。

1。window環境下使用window系統自帶的任務計劃程式,編寫bat檔案,原理就是能通過定時執行bat檔案。

而bat檔案內編寫的為使用該電腦上php 來 開啟 某.php 檔案。

簡單但是可用性不強,沒有日誌,無法查詢是否中斷,且需本機上進行。

windows上和linux上有一個類似的cmd和bat檔案,bat檔案類似於shell檔案,執行這個bat檔案,就相當於依次執行裡面的命令(當然,還可以通過邏輯來實現程式設計),所以,我們可以利用bat命令檔案在windows伺服器上面實現PHP定時任務。實際上在windows上定時任務,和linux上道理是一樣的,只不過方法和途徑不同。好了下面開始。

首先,在一個你覺得比較適當的位置建立一個cron.bat檔案,然後用文字編輯器開啟它(記事本都可以),在裡面寫上這樣的內容:

D:\php\php.exe -q D:\website\test.php

這句話的意思就是,使用php.exe去執行test.php這個php檔案,和上面的contab一樣,繞過了伺服器環境,執行效率也比較高。寫好之後,點選儲存,關閉編輯器。

接下來就是設定定時任務來執行cron.bat。依次開啟:“開始–>控制面板–>任務計劃–>新增任務計劃”,在開啟的介面中設定定時任務的時間、密碼,通過選擇,把cron.bat掛載進去。確定,這樣一個定時任務就建立好了,在這個定時任務上右鍵,執行,這個定時任務就開始執行了,到點時,就會執行cron.bat處理,cron.bat再去執行php。


2.linux環境下,此方法實用性強且廣泛被運用。

我們先從相對比較複雜的伺服器執行php談起。伺服器上安裝了php,就可以執行php檔案,無論是否安裝了nginx或Apache這樣的伺服器環境軟體。而Linux中,使用命令列,用CronTab來定時任務,又是絕佳的選擇,而且也是效率最高的選擇。

首先,進入命令列模式。作為伺服器的linux一般都預設進入命令列模式的,當然,我們管理伺服器也一般通過putty等工具遠端連線到伺服器,為了方便,我們用root使用者登入。在命令列中鍵入:

crontab -e

之後就會開啟一個檔案,並且是非編輯狀態,則是vi的編輯介面,通過敲鍵盤上的i,進入編輯模式,就可以編輯內容。這個檔案中的每一行就是一個定時任務,我們新建一行,就是新建一條定時任務(當然是指這一行內按照一定的格式進行書寫)。我們現在來舉個例子,增加一行,內容如下:

00 * * * * lynx -dump https://www.yourdomain.com/script.php

這是什麼意思呢?實際上上面這一行由兩部分組成,前面一部分是時間,後面一部分是操作內容。例如上面這個,

00 * * * *

就是指噹噹前時間的分鐘數為00時,執行該定時任務。時間部分由5個時間引數組成,分別是:

分 時 日 月 周

第1列表示分鐘1~59 每分鐘用或者 */1表示,/n表示每n分鐘,例如*/8就是每8分鐘的意思,下面也是類推
第2列表示小時1~23(0表示0點)
第3列表示日期1~31
第4列表示月份1~12
第5列標識號星期0~6(0表示星期天)

整個句子的後面部分就是操作的具體內容。

lynx -dump https://www.yourdomain.com/script.php

意思就是說通過lynx訪問這個url。我們在使用中主要用到lynx、curl、wget來實現對url的遠端訪問,而如果要提高效率,直接用php去執行本地php檔案是最佳選擇,例如:

00 */2 * * * /usr/local/bin/php /home/www/script.php

這條語句就可以在每2小時的0分鐘,通過linux內部php環境執行script.php,注意,這裡可不是通過url訪問,通過伺服器環境來執行哦,而是直接執行,因為繞過了伺服器環境,所以效率當然要高很多。

好了,已經添加了幾條需要的定時任務了吧。點選鍵盤上的Esc鍵,輸入“:wq”回車,這樣就儲存了設定的定時任務,螢幕上也能看到提示建立了新的定時任務。接下來就是好好寫你的script.php了。

關於CronTab的更多用法這裡就不介紹了,如果你想更靈活的使用這個定時任務功能,應該自己再去深入學習一下crontab。

其中,因為我的專案需要直接通過定時執行php檔案來更新資料庫。所以採用以下方法。

00 */2 * * * /usr/local/bin/php /home/www/script.php


00 */2 * * * /usr/local/bin/php /home/www/script.php