本教程使用的定时任务基于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).config.php 配置文件<?php /** * RabbitMQ_Config */ $config = [ 'host' => ...
(1).在PHP中可以查看的环境变量包括: (1.1).电脑环境变量 (2.1).服务器环境变量(2).getenv()函数获取一个环境变量的值.参数1是环境变量的key,参数2值为true的时候仅从你的电脑环境变量中查找,参数2值为false会从两种变量中全部查询//获取我电脑登录的用户名,输出A...
最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...
本教程使用的定时任务基于EasyTak,EasyTask官方文档:https://gitee.com/392223903/EasyTask由于tp3.2.x官方开发未考虑命令行支持和绝对路径开发的标准,因此我编写了一个支持的类来运行。1.在tp3.2.3根目录下安装easytaskcomposer&...
//设置客户端断开依然运行 ignore_user_abort(true); //设置脚本不超时 set_time_limit(0); //死循环每隔1秒访问一次网址 while (true) { sleep(1); &nb...
项目中需要加密超长json内容才发现rsa加密长度有限制,于是换一种思路:我们将原本需要加密的内容拆分为多个字符串,一段一段的加密,解密端也是一段一段的解密即可完成。(1).确认每次加密多少长度首先我们要知道rsa加密长度是多少,1024位的rsa能加密的长度也是1024位。那么我们一次加密多长的字...