百度搜索过相关的php计划任务的资料,特别是搜索thinkphp的计划任务,目前能明确实现的都是被动式的,就是通过tp3.2自带的计划任务类实现,通过挂钩子的形式,用户访问网站的时候就执行计划任务,这种不是我们需要,我们需要的是全自动,而且配置方便的。在GitHub上搜索的php计划任务有点脱离的tp5框架,如果用的话,需要加载tp5的底层类才行。

我实现的方法就是利用tp5命令行的功能,它能加载底层而且可以让框架在命令行上运行,这样最后部署的时候都可以很容易适应windows和linux,另外一个就是引用了linux的crontab思想,我把配置都放到同一个项目文件下面,这样就不需要为每一个计划任务去设置系统计划配置了。

第一步:设置计划任务的配置
在application\config.php下面添加这个配置,熟悉crontab的朋友就觉得这个格式是不是很像。

/*每分钟*/
/*每小时 某分*/
/*每天 某时:某分*/
/*每周-某天 某时:某分 0=周日*/
/*每月-某天 某时:某分*/
/*某月-某日 某时-某分*/
/*某年-某月-某日 某时-某分*/
'sys_crond_timer' => array('*', '*:i', 'H:i', '@-w H:i', '*-d H:i', 'm-d H:i

第二步:计划任务的核心代码。这一步已经帮大家实现了,大家需要理解的就是tp5的命令行实现就可以。在application\common\lib下面创建Crond.php文件。复制下面代码

<?php

namespace app\common\lib; use think\Config;
use think\console\Command;
use think\console\Input;
use think\console\Output; class Crond extends Command
{
protected function configure()
{
$this->setName('Cron')
->setDescription('计划任务');
} protected function execute(Input $input, Output $output)
{
$this->doCron();
$output->writeln("已经执行计划任务");
} public function doCron()
{
// 记录开始运行的时间
$GLOBALS['_beginTime'] = microtime(TRUE); /* 永不超时 */
ini_set('max_execution_time', 0);
$time = time();
$exe_method = [];
$crond_list = Config::get('crond'); //获取第四步的文件配置,根据自己版本调整一下
$sys_crond_timer = Config::get('sys_crond_timer');
foreach ( $sys_crond_timer as $format )
{
$key = date($format, ceil($time)); if ( is_array(@$crond_list[$key]) )
{
$exe_method = array_merge($exe_method, $crond_list[$key]);
}
} if (!empty($exe_method))
{
foreach ($exe_method as $method)
{
if(!is_callable($method))
{
//方法不存在的话就跳过不执行
continue;
} echo "执行crond --- {$method}()\n";
$runtime_start = microtime(true); call_user_func($method); $runtime = microtime(true) - $runtime_start; echo "{$method}(), 执行时间: {$runtime}\n\n";
} $time_total = microtime(true) - $GLOBALS['_beginTime'];
echo "total:{$time_total}\n";
}
}
}

第三步:配置命令行
在application\command.php 添加一行。注意这个命名空间,包括上面的文件也是。如果你部署的文件夹和我不一样,需要调整一下。

'app\common\lib\Crond'

第四步: 配置计划任务配置文件
这一步需要大家注意,由于这个属于tp5配置文件,tp5.0 和 tp5.01之后的配置文件存放位置不一样,大家根据自己版本调整。在application\extra\crond.php文件中

<?php

$crond_list = array(
'*' => [
'app\command\Test::firstTest'
], //每分钟 '00:00' => [], //每周 ------------
'*-01 00:00' => [], //每月--------
'*:00' => [], //每小时--------- ); return $crond_list;

这个配置文件跟第一步配置相关联的,配置的是某个具体的类和方法,主要一点要指定具体的命名空间和方法名,建议用静态方法,省去new对象,节省资源。方法名不要带(),否则执行不成功。
计划任务的执行命令行:cmd 打开到项目根目录

php think Cron

计划任务就这样实现了。最后就是部署到系统的计划任务中。让系统每分钟执行这个命令。

linux下面的crontab配置教程:

先在项目根目录创建一个crond.sh的执行文件,输入下面的内容(加上php程序的目录)

#!/bin/sh
PATH=/usr/local/php/bin:/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
cd /htdocs/baiben/www/
php think Cron

开放执行权限:chmond u+x crond.sh
然后运行下面的教程,配置计划任务:
命令行:crontab -e  
然后再界面输入:*/1 * * * * bash 你的目录/crond.sh
保存退出
然后重启crond:
命令:service crond restart
完成。

原文:https://blog.csdn.net/panxiong91/article/details/52841593

Thinkphp5 主动式 计划任务 支持windows和linux的更多相关文章

  1. FTP 客户端工具(支持 Windows/Unix/Linux)

    FTP 客户端工具,支持 Windows/Unix/Linux

  2. 【Linux】Mac好用虚拟机 Parallels Desktop、FinalShell-多终端连接工具(支持Windows,macOS,Linux)

    一.Mac好用虚拟机 Parallels Desktop 1.下载安装: 2.新建虚拟机: 3.配置管理: 二.FinalShell-多终端连接工具(支持Windows,macOS,Linux) 1. ...

  3. SQL Server 2017 正式发布:同时支持 Windows 和 Linux(现在看下来,当年那德拉的“云优先,移动优先”是有远见的,而且是有一系列的措施和产品相配合的,只是需要一点时间而已。真是佩服!!)

    微软在去年 3 月首次对外宣布了 Linux 版的 SQL Server,并于今年 7 月发布了首个公开 RC 版.前几日在美国奥兰多召开的微软 Ignite 2017 大会上,微软宣布 SQL Se ...

  4. C#搞跨平台UI,封装Cef作为Cpf的控件支持Windows,Linux,Mac

    终于封装完成了,采用离屏渲染方式,支持JS和C#互相调用,C#方法自动绑定到JS里,中文输入有自动调整输入法位置. 基于开源的CefGlue 移植,本来想用CefSharp,不过这个里面有很多C++的 ...

  5. Scrcpy用电脑控制Android手机(支持Windows/macOS/Linux)

    一.scrcpy简介 注意:拼写是scrcpy,非Python爬虫框架Scrapy. scrcpy可以通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备.它可以通过U ...

  6. C语言编码转换gb2312 to utf8,utf8 to gb2312 代码,GCC编译,支持Windows、Linux

    编译:gcc -o f.exe f.c -liconv #include <stdio.h> #include <stdlib.h> #include <stddef.h ...

  7. BesLyric 全新版本下载 ( windows \ mac \ linux )

    导读 BesLyric , 一款专门制作 网易云音乐 LRC 滚动歌词的软件! 搜索.下载.制作 歌词更方便! 很荣幸地,自 beslyric 2017 年开发推出以来,得到了很多云村村民的肯定,现在 ...

  8. python复制文件,路径不存在问题(Windows和linux路径分隔符不统一)

    问题: python脚本涉及到复制文件,而我们需要兼容Windows.linux和mac环境 (Windows和linux的路径分隔符不同:通过os.path.sep查看分隔符)   如果用[路径名+ ...

  9. Qt开源作品38-无边框窗体方案(无抖动,支持win、linux、mac等系统,侧边半屏顶部全屏)

    一 前言 不知道各位程序员有没有遇到过这样一种困惑,好不容易在开源网站找到了类似的想要的项目代码,结果down下来一编译,我勒个去,几百个错误,根本没法用,熟悉的人还好可以直接阅读代码进行修改(有些只 ...

随机推荐

  1. Linux的磁盘管理和文件系统

    一.磁盘结构 1.1.硬盘的物理结构 盘头:硬盘有多个盘片,每盘片2面 磁头:每面一个磁头 1.2.硬盘的数据结构 扇区:盘片被分为多个扇形区域,每个扇区存放512字节的数据,硬盘的最小存储单位 磁道 ...

  2. 基于RT1052 Aworks 内存扩容记录(一)

    本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发 1. 首先阅读原理图 内存容量由32M扩容至64M. 2. 再则比较两颗芯片的参数 通过比较32M和64M SDRAM ...

  3. NOIP 模拟 $30\; \rm 毛三琛$

    题解 \(by\;zj\varphi\) 二分答案,考虑二分背包中的最大值是多少. 枚举 \(p\) 的值,在当前最优答案不优时,直接跳掉. 随机化一下 \(p\),这样复杂度会有保证. Code # ...

  4. NOIP 模拟 $16\; \rm Lost My Music$

    题解 \(by\;zj\varphi\) 一道凸包的题 设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) ...

  5. 题解 数列 及exgcd总结

    传送门 自闭了--考场上exgcd打错然后对着屏幕自闭了一个小时不知道它为什么解得不对 开始恶补: 对于方程 \(a*x+b*y=c\) ,就等价于 \(a*x \equiv c\pmod{b}\) ...

  6. 【软件工具】Git 使用总结

    本地库就是由 对象 和 引用 构成的,或者叫 Repositories;下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 ...

  7. 是的你没看错,HTTP3来了

    目录 简介 HTTP成长介绍 不同HTTP协议解决的问题 HTTP3和QUIC TLS1.3 解决HoL阻塞 连接的迁移 总结 简介 很多小伙伴可能还沉浸在HTTP1.1的世界无法自拔,但是时代的洪流 ...

  8. 【springboot】知识点总结

    [springboot 基础编] 01.SpringBoot>01 - 第一个应用–HelloWorld 02.SpringBoot>02 - 整合 MyBatis 03.SpringBo ...

  9. Qt迭代器(Java类型和STL类型)详解

    迭代器为访问容器类里的数据项提供了统一的方法,Qt 有两种迭代器类:Java 类型的迭代器和 STL 类型的迭代器. 两者比较,Java 类型的迭代器更易于使用,且提供一些高级功能,而 STL 类型的 ...

  10. C#根据输入的字符串来创建类的实例

    abstract class Vehicle { public abstract void Drive(); } class Car : Vehicle { public override void ...