1. 程式人生 > >基於PHP的crontab定時任務管理

基於PHP的crontab定時任務管理

linux的crontab一直是伺服器運維、業務開展的利器。但當定時任務增多時,管理和遷移都變得很麻煩,而且容易出問題。下面提供了一個使用php編寫的crontab管理器,但仍需要在crontab下新增一個一分鐘執行一次的叫來來執行這個管理器。通過這個管理器,可以實現以下目的:

  • 分散式定時任務集中化管理
  • 多條crontab記錄合併
  • crontab記錄持久化儲存(配置檔案或資料庫)

這裡不建議你使用資料庫進行crontab配置管理,除非你能夠保證資料庫的請求能夠在長時間內保持穩定響應的話。推薦使用nosql型別的cache儲存,同時做好持久化備份。

廢話不多說,上一段測試程式碼:

define('DS', DIRECTORY_SEPARATOR);
requiredirname(__FILE__) . DS . 'vendor'. DS . 'autoload.php';
date_default_timezone_set('PRC');
 
error_reporting(E_ALL);
 
$crontab_config= [
    'test_1'=> [
        'name'=> '服務監控1',
        'cmd'=> 'php -v',
        'output'=> '/tmp/test.log',
        'time'=> '* * * * *'
    ],
    'single_test'=> [
        'name'=> 'php -i',
        'cmd'=> 'php -i',
        'output'=> '/tmp/single_script.log',
        'time'=> [
            '* * * * *',
            '* * * * *',
        ],
    ],
];
 
$crontab_server= new\Jenner\Zebra\Crontab\Crontab($crontab_config);
$crontab_server->start();

這段程式碼使用了php的包管理器composer,如果你不瞭解,可以手動把需要用到的類,include到你的php指令碼。

執行後,我們會在預設的日誌檔案(/var/log/php_crontab.log)中檢視crontab的執行記錄,當然你可以通過向Crontab傳遞第二個引數指定日誌檔案日誌(確保可寫)。日誌檔案內容如下:

[2014-11-10 19:50:08]-content:start. pid3778
[2014-11-10 19:50:08]-content:php -v
[2014-11-10 19:50:08]-content:php -i
[2014-11-10 19:50:08]-content:php -i
[2014-11-10 19:50:08]-content:end. pid:3778

 

日誌會記錄程式的啟動時間、執行的命令、pid等資訊。由於我是手動執行的,所以描述不是準確的00秒。正式使用時,在crontab中新增一條如下命令即可實現該管理器的自動執行。

* * * * * php php_crontab_manager.php

管理器相關依賴:
  • 程序控制包:"jenner/multi_process": "1.0.0",
  • pcntl擴充套件
  • crontab服務

jenner/multi_process包是一個簡單的程序控制包,主要是為了在執行定時任務時,使用子程序執行,這樣父程序就不會阻塞,造成定時任務延遲的問題。

專案地址:

這個專案託管在github上,同時提供了packagist包支援,你可以通過在composer.json中新增:"jenner/crontab": "1.0.0"來載入這個包。

具體原始碼可以在github檢視。