主要原理是通过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
<?php $base64_body = substr(strstr($_POST[base64],','),1); $data= base64_decode($base64_body); file_put_contents($_SERVER[&q...
原理:使用curl_init()创建多个请求实例,再使用curl_multi_init()批量执行创建的多个请求实例。文件1:curl.php<?php $threads=500;//并发请求次数 $url='http://blog.cn/index.php?';...
前面的文章对于高并发下单商品导致商品库存为负值的问题请先阅读再阅读本篇文章一定对您有帮助,建议亲手测试较好。加上文件锁后的下单处理代码:【一】.阻塞模式:(如果其他进程已经加锁文件,当前进程会一直等其他进程解锁文件后继续执行)<?php //连接数据库 $con=mysqli_connect(...
header() 函数向客户端发送原始的 HTTP 报头。(官方解释)通俗的讲header函数将参数中的字符串作为服务端的响应头来返回给客户端。什么是服务端的响应头?打开谷歌浏览器看看network中的请求response header信息即可。更多的参数百度response header即可浏览器...
001源码:/* * $xml_str是xml字符串 */ function xmltoarray($xml_str) { //禁止XML实体扩展攻击 libxml_disable_entity_loader(true); //拒绝包含...
逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event { /** &nbs...