本教程使用的定时任务基于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。记得用星星支持我们哦。
本篇文章不是讲解如何用.net开发自己的dll然后PHP通过com调用。主要记录PHP官方支持的DOTNET 基本语法如下:$obj = new DOTNET("assembly", "classname")a...
使用php函数array_multisort()即可实现和SQL一样的order by排序. 例如我们需要对会员表按照主键降序排列,年龄升序排列://会员表数据 $list = []; $list[] = ['mid' =>&n...
上篇文章已经讲解arrayacces的原理,现在来讲解下arrayaccess的实际应用。一个大型的互联网项目中必然会存在各种配置信息,例如多种数据库信息:mysql,tidb,mongodb,redis,某个业务模块单独的配置信息如比例,额度等等,那么该如何治理配置信息?PHP项目中大部分的框架都...
(1).在PHP中可以查看的环境变量包括: (1.1).电脑环境变量 (2.1).服务器环境变量(2).getenv()函数获取一个环境变量的值.参数1是环境变量的key,参数2值为true的时候仅从你的电脑环境变量中查找,参数2值为false会从两种变量中全部查询//获取我电脑登录的用户名,输出A...
在编写多进程的实例中我在每个进程中使用如下代码://调用等待信号的处理器 while (true) { pcntl_signal_dispatch(); }开启5个进程,cpu直接100%修正之后的代码://调用等待信号的处理器 while&...
由于workerman底层直接读取$_SERVER['argv']的命令行参数,没有提供独立的方法start/stop,而tp的命令行参数无法适配workerman,虽然thinkphp官方专门做了一个适配的版本,但是看了下评论问题挺多的。于是自己来搞一个.(1).在applicat...