使用Timer創建定時的任務,可以以后臺守護進程的方式執行。
Worker::runAll()執行時,會執行其中的parseCommand()方法。
protected static function parseCommand()
{
// 守護進程執行方式,只會在LINUX系統下才可以
if (static::$_OS !== \OS_TYPE_LINUX) {
return;
}
// 命令和參數是通過$argv傳遞給Workerman的。
global $argv;
// Check argv;
$start_file = $argv[0];
$available_commands = array(
'start',
'stop',
'restart',
'reload',
'status',
'connections',
);
//
// 通常的執行命令格式:
// php timer.php start
// php timer.php start -d
// 對應的$argv[0]=timer.php,$argv[1]=start
//
$usage = "Usage: php yourfile <command> [mode]\nCommands: \nstart\t\tStart worker in DEBUG mode.\n\t\tUse mode -d to start in DAEMON mode.\nstop\t\tStop worker.\n\t\tUse mode -g to stop gracefully.\nrestart\t\tRestart workers.\n\t\tUse mode -d to start in DAEMON mode.\n\t\tUse mode -g to stop gracefully.\nreload\t\tReload codes.\n\t\tUse mode -g to reload gracefully.\nstatus\t\tGet worker status.\n\t\tUse mode -d to show live status.\nconnections\tGet worker connections.\n";
if (!isset($argv[1]) || !\in_array($argv[1], $available_commands)) {
if (isset($argv[1])) {
static::safeEcho('Unknown command: ' . $argv[1] . "\n");
}
exit($usage);
}
// Get command.
$command = \trim($argv[1]);
$command2 = isset($argv[2]) ? $argv[2] : '';
// Start command.
$mode = '';
if ($command === 'start') {
if ($command2 === '-d' || static::$daemonize) {
$mode = 'in DAEMON mode';
} else {
$mode = 'in DEBUG mode';
}
}
... ...
}
所以,Workerman建議的使用方法是,創建單獨的執行文件。
<?php
require_once 'vendor/workerman/workerman/Autoloader.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
$worker = new Worker();
$worker->onWorkerStart = function()
{
// 每隔3秒鐘執行一次
Timer::add(3, function() {
echo 'Hello ' . date('Y-m-d H:i:s') . PHP_EOL;
});
};
Worker::runAll();
如何與Thinkphp的命令模式集成在一起使用的?那就需要在Command文件中按照Workman的要求,重置$argv參數數組。
參考手把手教你在tp6中實現毫秒級定時任務功能。
protected function initialize(Input $input, Output $output)
{
global $argv;
if ($input->hasOption('i'))
$this->interval = floatval($input->getOption('i'));
$argv[1] = $input->getArgument('status') ?: 'start';
if ($input->hasOption('d')) {
$argv[2] = '-d';
} else {
unset($argv[2]);
}
}
浙公網安備 33010602011771號