1. 程式人生 > >php_crond:一個基於多程序的定時任務系統-支援秒粒度的任務配置

php_crond:一個基於多程序的定時任務系統-支援秒粒度的任務配置

php_crond

基於多程序的定時工作管理員,支援秒級別的定時任務

特性

  • 通過配置檔案管理所有定時任務
  • 支援秒級的定時任務粒度
  • 使用symfony/process進行程序管理
  • 使用React/event-loop執行事件迴圈
  • 提供http服務,遠端檢視和操作php_crond(參見:API文件

執行

啟動crond

php bin/crond.php

在後臺啟動crond

nohup php bin/crond.php > /dev/null 2>&1 &

傳送USR1訊號,安全關閉crond 主程序會等待所有的子程序任務結束,才會正式退出

kill -USR1 `cat logs/crond.pid`

傳送USR2訊號,重新讀取task配置檔案

kill -USR2 `cat logs/crond.pid`

基本配置

服務配置檔案config/base.php

return [
    //模式
    'model' => 'daemon',
    //PHP程式路徑
    'php' => '/usr/local/php-5.6.30/bin/php',
    //日誌檔案
    'log_file' => PROJECT_ROOT . "/logs/crond.log",
    //主程序pid檔案
    'pid_file' => PROJECT_ROOT . "/logs/crond.pid",
    //http介面服務,提供介面遠端操作php_crond
    'http_server' => [
        'switch' => false,//是否啟動http服務
        'listen' => '127.0.0.1',
        'port' => 8080,//監聽埠
    ],
];

任務配置

任務配置檔案config/task.php

/**
 * task配置檔案
 * 例子:
 * 'process_a' => [
 *      'daemon' => '* * * * * *',//秒 分 時 日 月 周
 *      'filename' => '/usr/local/php/bin/php', //執行程式
 *      'params' => [],//執行程式引數
 *      'single' => true,//如果程序在執行,則不執行,只保持一個程序
 *      'standard_ouput' => '', //標準輸出
 *      'error_output' => '', // 錯誤輸出
 *  ]
 */

return [
    'process_a' => [
        'daemon' => '*/3 * * * * *',
        'filename' => '/usr/local/php-5.6.30/bin/php',
        'params' => ['/www/tests/pcntl/examples/a.php'],
        'single' => true,
        'standard_ouput' => '/www/tests/pcntl/examples/a.log',
        'error_output' => '/www/tests/pcntl/examples/a.log',
    ]
];

如果你需要配置非常多的任務,可以使用Crond\Task\Directory::registerTaskDirectory,該方法會遍歷註冊目錄下的所有.php檔案,並返回其中的任務列表

return Crond\Task\Directory::registerTaskDirectory(__DIR__ . "/tasks");

允許配置外部介面,用於返回任務列表。引數url=介面地址,serverId=作為服務標識

PS:你可能需要額外搭建後臺用於任務管理

return \Crond\Task\Remote::registerTask($url, $serverId);

介面返回例子

{
    "process_a": {
        "daemon": "0 * * * * *",
        "filename": "echo",
        "params": ["hello world!"],
        "single": true,
        "standard_ouput": "/dev/null",
        "error_output": "/dev/null"
    }
}