本教程使用的定时任务基于EasyTak,EasyTask官方文档:https://gitee.com/392223903/EasyTask
由于tp3.2.x官方开发未考虑命令行支持和绝对路径开发的标准,因此我编写了一个支持的类来运行。
1.在tp3.2.3根目录下安装easytask
composer require easy-task/easy-task
2.创建一个执行命令行的入口文件:console.php
<?php class ThinkSupport { /** * argv * @var mixed */ private $argv; /** * argc * @var mixed */ private $argc; /** * action * @var string */ private $action; /** * force * @var string */ private $force; /** * Support constructor. */ public function __construct() { //重置工作目录(only_win_system) chdir(dirname(__FILE__)); //保存Cli_Input $this->argv = $_SERVER['argv']; $this->argc = $_SERVER['argc']; //保存命令并清空Cli_Input $this->action = isset($_SERVER['argv']['1']) ? $_SERVER['argv']['1'] : ''; $this->force = isset($_SERVER['argv']['2']) ? $_SERVER['argv']['2'] : ''; $_SERVER['argv'] = [] && $_SERVER['argc'] = 0; //抑制Tp错误 if (!isset($_SERVER['REMOTE_ADDR'])) $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; if (!isset($_SERVER['REQUEST_URI'])) $_SERVER['REQUEST_URI'] = 'localhost'; } /** * 加载Think代码 * @param Closure $think * @return ThinkSupport */ public function invokeThink($think) { ob_start(); $think(); ob_get_clean(); return $this; } /** * 加载你的代码 * @param Closure $code */ public function invokeYourCode($code) { //恢复Cli_Input.(方便自己扩展) $_SERVER['argv'] = $this->argv; $_SERVER['argc'] = $this->argc; //执行 $code($this->action, $this->force); } } /** * Demo */ (new ThinkSupport()) ->invokeThink(function () { //加载tp的代码 require './index.php'; }) ->invokeYourCode(function ($action, $force) { // 加载Composer require './vendor/autoload.php'; // 初始化 $task = new \EasyTask\Task(); // 设置项目名称 $task->setPrefix('Think'); // 设置后台运行 $task->setDaemon(false); // 设置日志保存目录 $task->setRunTimePath('./Application/Runtime/'); // 添加闭包任务,开2个进程10s执行1次访问网址 $task->addFunc(function () { @file_get_contents('http://xingxinghan.cn/?id=6'); }, 'RenWu1', 10, 2); // 添加执行tp控制器的方法,开1个进程15s执行1次访问网址 $task->addClass('\Home\Controller\IndexController', 'curl', 'RenWu2', 15, 1); // 添加执行系统命令的任务,启动2个进程每隔5s执行一次 $task->addCommand('php D:/wwwroot/thinkphp_3.2.3_core/test.php', 'RenWu3', 5, 2); // 根据命令执行 if ($action == 'start') { $task->start(); } if ($action == 'status') { $task->status(); } if ($action == 'stop') { $force = ($force == 'force'); //是否强制关闭 $task->stop($force); } });
3.执行定时任务命令(windows用powershell执行)
php ./console.php start
启动成功输出任务表格
4.查询定时任务(windows用powershell执行)
php ./console.php status
成功输出任务表格
5.关闭定时任务(windows用powershell执行)
php ./console.php stop
6.强制关闭定时任务(windows用powershell执行)
php ./console.php stop force
警告: 由于tp在命令行执行必须要加载一下自己的默认方法,默认方法就是index控制器的index方法,因此此方法必须存在。或者你可以把它设置为空方法。当然如果比并不需要再任务中执行tp的控制器方法,不需要加载tp的东西,可以不执行invokeThink方法。
提示:后台执行失败可修改为前台启动查看问题或者查看日志文件,有问题可以在qq群反馈bug。记得用星星支持我们哦。
开启错误提示代码:ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);关闭错误提示代码:error_reporting(E_ALL ^&n...
本篇文章不是讲解如何用.net开发自己的dll然后PHP通过com调用。主要记录PHP官方支持的DOTNET 基本语法如下:$obj = new DOTNET("assembly", "classname")a...
php官方已经提供了Iterator(迭代器)接口,通过网上资料的学习,目前看适合超大集合或者数组提取使用。学习一个函数的实现对比内存占用差距.使用迭代器和普通循环实现range()函数。(1).普通循环实现range()函数。function newrange($low, $h...
xmlrpc协议是通过http请求xml数据进行通信。webservice中和它相同的是soap。soap调用的确很简单,但是创建wsdl太繁琐,效率低下。xmlrpc很好的解决这个问题。(1).创建xmlrpc服务端(求和函数api)function getSum($method,$ar...
主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:<?php /** * 订单任务 */ class Order { &n...
最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...