实现思想:
1、使用Linux系统闹钟信号,实现秒级定时器。
2、通过创建子进程,不会出现任务阻塞的情况,即使是while(1)。
3、Linux Crontab 也是这个原理。
核心代码:
\pcntl_async_signals(true);
$flag = true;
\pcntl_signal(SIGALRM,function()use(&$flag){
var_dump(\date('Y-m-d H:i:s'));
if ($flag)
{
$flag = false;
\pcntl_alarm(3);
}
// 阻塞任务,创建一个子进程处理,防止阻塞主进程
$pid = \pcntl_fork();
if($pid === 0)
{
// 处理业务需求
$loop = 10;
\cli_set_process_title("Worker:timer");
while(--$loop>=0)
{
var_dump(\getmypid()."::: {$loop}");
\sleep(1);
}
exit(0);
}
\pcntl_alarm(0);
});
\pcntl_alarm(1);
while(1)
{
if(\pcntl_wait($status, WUNTRACED) > 0)
{
var_dump("status = ". $status);
echo 'Master::loop()'.PHP_EOL;
break;
}
}
总结:
以上代码仅限参考,参考思路可自由设计;
核心原理,大概就如上了!
|