PHP實現定時任務(非linux-shell方式,與作業系統無關)

發表於2017-08-16

頁面互動效果

下面是寫好的示例前端互動頁面,主要是列表頁面,編輯頁面。

主要互動有:

1 開啟定時任務程式
2 關閉定時任務程式
3 新增一項定時任務
4 編輯已有的定時任務
5 刪除定時任務
6 開始一項定時任務
7 停止一項定時任務

定時任務分兩種:

1 執行一次
2 迴圈執行

定時任務執行的內容:

定時任務執行的內容其實還是一個http請求。 通過定時的方式,指定時間執行或者循執行。

1 列表頁面

圖片名稱

2 新建\編輯頁面

圖片名稱

程式碼地址,演示地址

示例程式碼是基於Laravel,Alpaca-spa框架編寫,並且作為 ‘Alpaca-Spa-Laravel後臺管理平臺’的一個模組兒整合於系統中。

程式碼 : http://git.oschina.net/cc-sponge/Alpaca-Spa-Laravel

程式碼 : https://github.com/big-sponge/Alpaca-Spa-Laravel

Alpaca-Spa-Laravel : http://full.tkc8.com

Alpaca-Spa : http://www.tkc8.com

適用範圍

定時精確時間不低於1秒。web服務重啟、或者php重啟。該定時任務不會自動重啟。

實現原理

用PHP實現定時任務(非linux-shell方式,與作業系統平臺無關),主要兩個技術點:

1)PHP後臺程式
2)PHP非同步處理

1 PHP後臺程式

一般情況,用命令列可以開啟一個php後臺程式。而在瀏覽器中通過HTTP請求一個php處理,會因為瀏覽器關閉,或者請求超時,使得後臺的php處理中斷。但是php提供了兩個方法可以會忽略瀏覽器關閉、請求超時:

因此,我們可以使用這兩個函式從瀏覽器以HTTP請求的方式開啟一個php後臺程式。

2 PHP非同步處理

php語言本身沒有可以跨平臺好用非同步處理方法,但是可以通過curl或者fsockopen建立一個請求來實現非同步處理。這裡我們用fsockopen方法實現:

前臺互動控制器

為了在前端介面方便控制定時任務的開啟關閉,新增、編輯、刪除,檢視執行狀態。 同時也可以新增許可權控制。 主要有8個操作介面(下面是以Laravel 路由示例):

1 檢視定時任務程式狀態
2 開始定時任務程式 3 停止定時任務程式
4 新增,或者編輯定時任務
5 設定定時任務狀態
6 獲取指定定時任務明細
7 刪除定時任務
8 獲取定時任務列表

完整的類程式碼如下:

實現後臺程式類

使用 ignore_user_abort(true); set_time_limit(0); 可以從瀏覽器開啟一個php後臺程式。為了避免出現多個後臺程式,需要藉助一個配置來標識該後臺程式是否已經啟動

當code是1001時候,表示後臺程式未啟動,這時通過http請求開啟後臺程式時,正常啟動

當code是1000時候,表示後臺程式已經啟動,這時通過http請求開啟後臺程式時,不做任何操作,以為程式已經啟動

當開啟後臺程式的請求到達後臺時候,讀取配置檔案,如果code是1001,則啟動程式,並且設定code為1000,儲存配置檔案。

當關閉後臺程式的請求到達後臺時候,讀取配置檔案,設定code為1001,儲存配置檔案。

後臺程式在執行時候,每隔一秒讀取配置檔案,判斷code狀態,如果是1001,則結束執行; 如果是1000,則繼續執行

完整類的程式碼如下:

實現非同步處理的類

完整類的程式碼如下:

定時任務處理類

定時任務處理類 主要是實現新增、編輯、刪除定時任務,執行定時任務要處理的方法

定時任務的資訊以json格式存放在下面的配置檔案中

主要的欄位為:

INDEX 索引
BEGIN_TIME 開始時間
END_TIME 結束時間
INTERVAL 時間間隔
NAME 名稱
STATUS 狀態 1-ENABLED, 2-DISABLE
TASK_TYPE 型別 1-ONCE, 2-LOOP
ACTION 要執行的Action

類中主要有7個方法:

listTask() 檢視定時任務列表 addTask() 新增定時任務 editTask() 編輯定時任務 editTaskStatus() 編輯定時任務狀態 getIndexTask() 獲取指定定時任務資訊 removeTask() 刪除定時任務 doTask() 執行定時任務指定的任務

完整類的程式碼如下:

定時任務程式入口控制器

主要是為了實現非同步開啟後臺程式

以上是PHP實現定時任務的核心類與方法, 完整的程式碼請參看程式碼伺服器中提供的原始碼。

相關文章