本教程使用的定时任务基于EasyTak实现,EasyTask官方参考文档:https://gitee.com/392223903/EasyTask
首先我们必须明白PHP的定时器只能基于CLI命令行形式运行,由于FPM形式用完即走,内存立即释放,无法做到常驻,当然我们也可以让FPM常驻起来,但是内存开销过大。因此FPM本身就是官方用来提供给我们做网站CURD的,而CLI模式才是后端核心,大量的PHP服务都是基于PHP_CLI模式,因此高级程序员更必须了解CLI模式。但凡大点的公司都是用FPM处理网页,CLI处理服务队列。下面的定时任务也是基于CLI执行。
我们使用的定时任务包是EasyTask,先安装它(需要安装的扩展请看它的官方文档,切记没有必要安装event扩展):
composer require easy-task/easy-task
我们创建一个console.php简单使用它:
// 加载Composer代码
require './vendor/autoload.php';
//初始化
$task = new Task();
// 设置非常驻内存
$task->setDaemon(false);
// 设置项目名称
$task->setPrefix('EasyTask');
// 设置记录运行时目录(日志或缓存目录)
$task->setRunTimePath('./Application/Runtime/');
// 1.添加闭包函数类型定时任务(开启2个进程,每隔10秒执行1次你写闭包方法中的代码)
$task->addFunc(function () {
$url = 'https://blog.20230611.cn/?id=243';
@file_get_contents($url);
}, 'request', 10, 1);
// 启动任务
$task->start();我们执行这个脚本:
php console.php start
如果是windows系统,我们看到启动了2个cmd窗口,1个窗口是守护进程,1个是执行上面的每隔10s访问网站的定时任务的进程,测试成功。
那么我们如果不显示cmd执行呢,只需要修改为常驻运行:
// 设置常驻内存 $task->setDaemon(true);
那我们如何添加多个定时任务呢?只需要多调用addFunc方法添加任务进去即可,下面再添加1个15秒的定时任务
$task->addFunc(function () {
$url = 'https://blog.20230611.cn/?id=2432';
@file_get_contents($url);
}, 'request2', 15, 1);上面只是说添加任务,那么如何去管理呢?官方给了一个基础的命令整合命令:
// 获取命令
$force = empty($_SERVER['argv']['2']) ? '' : $_SERVER['argv']['2'];
$command = empty($_SERVER['argv']['1']) ? '' : $_SERVER['argv']['1'];
// 配置任务
$task = new Task();
$task->setRunTimePath('./Application/Runtime/');
$task->addFunc(function () {
$url = 'https://blog.20230611.cn/?id=271';
@file_get_contents($url);
}, 'request', 10, 2);;
// 根据命令执行
if ($command == 'start')
{
$task->start();
}
elseif ($command == 'status')
{
$task->status();
}
elseif ($command == 'stop')
{
$force = ($force == 'force'); //是否强制停止
$task->stop($force);
}
else
{
exit('Command is not exist');
}
启动任务: php console.php start
查询任务: php console.php status
普通关闭: php console.php stop
强制关闭: php console.php stop force当然你可可以在任务管理中找到所有进程进行关闭。事实上EasyTask还支持addClass方式添加定时器去执行类的方法,也支持addCommand方法添加定时器去执行cmd或者shell命令,也支持crontab格式的指令,可以了解官网文档尝试。不懂可以进群讨论。
(1).创建数据库test ,创建表shop(字段id,total),商品id是1,商品总数10 (2).PHP模拟购买,商品数量大于0才能购买<?php //连接数据库 $con=mysqli_connect("192.168.2.18...
<?php $data=array('a'=>1,'b'=>2,'c'=>3,'d'=>4); extract($data); var_dump($a,$b,$c,$d); ?>在人人商城中捡到的...
开发com组件可以用c++,vc++,net,我比较熟悉net,演示用dnet(1).创建项目:启动vs2017,新建项目,选择Visual C# ->Windows桌面->类库通用windows(2). 修改Com项目:点击 项目->项目属性,再点击应用程序->程序集信息,...
array_merge是最常用的数组合并方法,+号同样也可以,但是却有很大不同。array_merge遇到相同字符串key,后面数组的key会覆盖前面数组的key,+号正好相反。$a = [ 'one' => 'A on...
(1).学习目标: 了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习: (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...
【一】.迭代器迭代是指反复执行一个过程,每执行一次叫做一次迭代。比如下面的代码就叫做迭代:1. <?php 2. $data = ['1', '2', &...