主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:
<?php
/**
* 订单任务
*/
class Order
{
public function run()
{
file_put_contents("log1.txt", '我是订单任务,本次运行时间:' . date('Y-m-d H:i:s') . "\r\n", FILE_APPEND);
}
}
/**
* 商品任务
*/
class Goods
{
public function run()
{
file_put_contents("log2.txt", '我是商品任务,本次运行时间:' . date('Y-m-d H:i:s') . "\r\n", FILE_APPEND);
}
}
/**
* Task任务核心
*/
class Console
{
/**
* 定时任务配置和执行时间间隔
*/
protected static $tasks = [
'Order' => 5,
'Goods' => 10,
];
/**
* 初始化为每个任务分配进程
*/
public static function init()
{
$tasks = self::$tasks;
foreach ($tasks as $task => $second)
{
//创建子进程
$pid = pcntl_fork();
if ($pid == -1)
{
die ('创建子进程失败!');
}
elseif ($pid)
{
//等待子进程执行完成回收,并且设置非阻塞
pcntl_wait($status, WNOHANG);
}
else
{
self::process($task, $second);
//子进程执行完成关闭,避免重复fork
die();
}
}
}
/**
* 子进程闹钟处理任务
*/
public static function process($task, $second)
{
//安装信号管理
pcntl_signal(SIGALRM, function () use ($task, $second) {
pcntl_alarm($second);
$taskObj = new $task();
call_user_func([$taskObj, 'run']);
}, false);
//发送闹钟信号
pcntl_alarm($second);
//调用等待信号的处理器
while (true)
{
pcntl_signal_dispatch();
}
}
}
//初始化
Console::init();程序执行后.主进程会根据已经配置的任务数来分配子进程,每个子进程来定时执行对应的任务,可以用来做redis消费者。
以上只是给你一个思路来实现,你还可以直接用我开源的定时器直接使用,访问地址:https://gitee.com/392223903/EasyTask
首先下载wkhtmltox-0.12.4_linux-generic-amd64.tar.xz (不要下载RPM包,依赖太多,需要x-server支持),并解压,执行测试运行正常tar wkhtmltox-0.12.4_linux-generic-amd64.tar.xzcd...
因项目需要需要统计用户无限下级计算分销佣金,计算每月分红,计算无限下级团队的业绩,需要先获得某个会员的无限下级成员。先看看数据库中的member表字段id username &...
源码:特别适用于微信支付中通知微信支付网关function array2xml($arr, $level = 1) { $s = $level == 1 ? "<xml&g...
面试中PHP面试官会问调用一个不存在的方法,如何知道是哪个文件哪行调用的?假设方法是getWorkLoad()回答1:开启PHP错误输出,PHP会输出Fatal error: Call to undefined function getWorkLoad() in D:\wwwroot\thinkpa...
最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...
断点下载的原理:http请求头添加Range参数告诉文件服务器端需要的字节范围例如1个文本文件的字节为1000,第一次请求Range: bytes=0-500第二次请求Range: bytes=501-1000通过每次的请求将返回的流追加写入到文件。注意的项目:断点下载服务器端的每次只返回字节传输的...