php——实现linux的定时任务
在php学习和工作生活中,经常需要定时去执行任务,一般可以分为纯代码实现和借助linux的定时任务管理器cron.d或者crontab来实现。
1.先来说一下纯代码是如何实现的。
<?php
ignore_user_abort();//关闭浏览器仍然执行
set_time_limit(0);//让程序一直执行下去
$interval=3;//每隔一定时间运行 3代表3s
do{$msg=date("Y-m-d H:i:s");file_put_contents("log.log",$msg,FILE_APPEND);//记录日志sleep($interval);//等待时间,进行下一次操作。
}while(true);
?>
这是一个基本的定时器,但是这个定时器有一个缺陷,因为while的判定条件是true,一旦这个程序执行就不可控制了,除非重启服务器或者关机,非常麻烦。现在可以加入一个控制条件,来控制这个定时器的开与关。
新建一个controller.php
<?php
return 1;//1执行脚本 0退出执行脚本
?>
定时器timer.php改为
<?phpignore_user_abort();//关闭浏览器后,继续执行php代码set_time_limit(0);//程序执行时间无限制$sleep_time = 5;//多长时间执行一次$switch = include 'switch.php';while($switch){$switch = include 'switch.php';$msg=date("Y-m-d H:i:s").$switch;file_put_contents("log.log",$msg,FILE_APPEND);//记录日志sleep($sleep_time);//等待时间,进行下一次操作。}exit();?>
这就是纯代码实现定时任务的基本方法了,但是存在局限性。现在再来介绍一下linux的定时任务管理器,cron.d或者crontab。
2.cron.d增加定时任务
当我们要增加全局性的计划任务时,一种方式是直接修改/etc/crontab。但是,一般不建议这样做,/etc/cron.d目录就是为了解决这种问题而创建的。
例如,增加一项定时的备份任务,我们可以这样处理:在/etc/cron.d目录下新建文件backup.sh,内容如下:
# m h dom mon dow user command
* 1 * * * root /sbin/mon_zetc_logtar.sh
cron进程执行时,就会自动扫描该目录下的所有文件,按照文件中的时间设定执行后面的命令。
cron执行时,也就是要读取三个地方的配置文件:一是/etc/crontab,二是/etc/cron.d目录下的所有文件,三是每个用户的配置文件。
所以在我们就可以使用php代码中在/etc/cron.d目录下新建*.sh文件,然后将定时任务写入*.sh文件中,这样就完成了cron.d增加定时任务。
3.crontab增加定时任务
一般,使用crontab -e命令来编辑定时任务列表,将定时任务写入列表中。
如何用php代码设置crontab,具体看下面代码例子。
<?php/*Filename: PhpCrontab.phpComment: php 控制linux crontab 命令User: lxdTime: 15/11/13 13:55*/class PhpCrontab {private $_crontab_obj = null;//构造 引入 是放在同一个目录里面的 public function __construct() {set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__);spl_autoload_register(function($class_name) {//需要将引入的文件全部小写spl_autoload($class_name,'.php');});$this->_crontab_obj = new CrontabManager();}/** 新增任务* @param id 任务唯一标示符,自己数据库的,方便自己后期处理* @param time 任务执行时间* @param job 任务具体内容** @return false | 任务自身的id标志*/public function addJob($id,$time,$job) {//新增任务$job_obj = $this->_crontab_obj->newJob();$job_obj->on($time)->addComments(array($id))->doJob($job);$this->_crontab_obj->add($job_obj);$this->_crontab_obj->save();$job_obj = $time = null;//获取任务列表$job_arr = $this->getJobList();//通过$id 找到任务的自身idforeach($job_arr as $k => $v) {//正则匹配$pattern = '/#\s[\w]+(\s|$)/iU';$match_info = array();$is_match = preg_match_all($pattern,$v,$match_info);if(!$is_match)return false;if(trim($match_info[0][0]) == '# ' . $id)return str_replace("\n",'',$match_info[0][1]);}return false;}/** 获取任务列表* @param void* @return array*/public function getJobList() {//获取字符串任务列表$job_str = $this->_crontab_obj->listJobs();//解析为数组,返回return explode("\n\n",$job_str);}/** 清理一条任务* @param 任务自身的id* @return true | false*/function deleteJob($job = null) {$jobsDeleted = 0;if (!is_null($job)) {$data = array();$oldJobs = explode("\n", $this->listJobs()); // get the old jobsif (is_array($oldJobs)) {//放置comment 信息$_comment = '';foreach ($oldJobs as $oldJob) {if ($oldJob != '') {//加入判断,匹配出comment信息if(preg_match_all('/^#(.*)/',$oldJob,$match_arr)) {$_comment = $match_arr[0][0];continue;}if (!preg_match('/' . $job . '/', $oldJob)) {$newJob = new CronEntry($oldJob, $this);$newJob->lineComment = '';//设置comment 信息$newJob->comments = array($_comment);$_comment = '';$data[] = $newJob;} else {$jobsDeleted++;}}}}$this->jobs = $data;}return $jobsDeleted;}/** 析构*/public function destruct() {$this->_crontab_obj = null;}}
然后在需要操作crontab的地方引用该文件,实例化类,新增定时任务就可以了。希望可以帮到大家,谢谢。
php——实现linux的定时任务相关推荐
- Linux基础系列(六)Linux系统定时任务Crond
Linux系统定时任务Crond Crond是什么 Crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件. 特殊需求:(秒级别)crond服务就无法搞定,一般工作中邪脚本守护进程 ...
- python定时任务crontab_【Python】Linux crontab定时任务配置方法(详解)
CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. cron 系统调度 ...
- linux创建定时任务命令,linux设置定时任务的方法步骤
一,首先登录 二,找到文件夹 三,查看定时任务 crontab -l 四,vi root 编辑定时任务 编辑完成后,点ESC,然后:wq 时间格式 分钟 小时 日期 月份 周 命令 数字范围 0-59 ...
- Linux crontab 定时任务命令详解
Linux Crontab 定时任务 命令详解 [日期:2016-02-13] 来源:Linux社区 在工作中需要数据库在每天零点自动备份所以需要建立一个定时任务.我选择在Linux下使用Cronta ...
- 老男孩Linux Crond定时任务练习题
Linux Crond定时任务练习题 Crond是系统中用来定期执行命令或指定程序任务的一种服务或软件. 严格的说,linux系统下的定时任务软件不少,例如:at.crontab.anacron,其中 ...
- Linux系统定时任务Crond
Linux系统定时任务Crond Crond是什么 Crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件. 特殊需求:(秒级别)crond服务就无法搞定,一般工作中邪脚本守护进程 ...
- 【Linux】定时任务crontab和at命令详解
[Linux]定时任务crontab和at命令详解 linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的 ...
- Linux系统定时任务crond那些事
1 Linux系统定时任务 1.1 定时任务介绍 1.1.1 Crond是什么? Crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件.Centos5/6 linux系统安装完操 ...
- Linux | crontab定时任务及开机自启项
本文总结如何使用 crontab 创建定时任务及开启自启项 1. 本文基于 CentOS 7.9 系统所写. Updated: 2022 / 9 / 5 Linux | crontab定时任务及开机自 ...
- linux设置定时任务(crontab)
Linux设置定时任务 crontab命令概述 crontab命令用于设置周期性被执行的指令,并将其存放在/etc/crontab文件,以供之后读取和执行. cron系统调度进程,可以使用它在每天的非 ...
最新文章
- ETSI MEC — 面向边缘计算的 5G 增强技术探讨
- 笔记:编写高质量代码 改善Java程序的151个建议
- 用MathType编辑带点星号的流程
- WWDC 2013 Session笔记 - Xcode5和ObjC新特性
- bzoj1037[ZJOI2008]生日聚会Party dp
- Fleet究竟是什么?为什么最近这么火~
- Python 建模步骤
- 使用eclipse创建我的第一个JSP项目
- linux重装系统保留文件,linux重装系统,如何保存硬盘中的内容
- 一个程序员应该怎样去学习和掌握计算机英语呢
- MySQL数据库 -- 库和表的操作
- 4.15 使用渐变映射命令制作艺术效果 [原创Ps教程]
- 银行贷款,求每月等额还款金额
- 国产DSP/ARM+复旦微ZYNQ/A7/K7 FPGA系列解决方案
- 利用 sqlplus spool 实现oracle 导出 csv 文件
- Redis源码分析之unlock
- ZOJ 3716 Ribbon Gymnastics 解题报告
- Django框架的模型层之多表操作
- 宝藏又小众的家长/学生设计模板素材网站分享
- VMware vSphere ESXi 6.7/7.0 定制安装盘(驱动或者SLIC)
热门文章
- 用matlab画出一元二次的图,MATLAB 一元二次函数的画图.doc
- PXE网络安装已经无人值守安装教程
- 从chrome有的插件打包到其他的google浏览器安装使用(离线安装)
- 学习笔记 计算机系统概述_计算机硬件的基本组成
- 0330Linux软件包安装和卸载
- Java Socket实现简易多人聊天室传输聊天内容或文件
- Python+Socket实现多人聊天室,功能:好友聊天、群聊、图片、表情、文件等
- 第一本 ECharts 数据可视化书籍出版了!
- 使用单相变频电源有哪些优势呢?
- Linux系统下Snmp的配置及SNMP介绍