PHP脚本定时任务实现及crontab实现定时任务

由于PHP只能被用户触发,被调用,调用后会自动退出内存,没有常驻内存。所以实现定时任务都是循环的执行某一个脚本。
PHP定时任务实现主要有两个方向:
1、循环脚本本身或脚本中代码循环执行
2、服务器定时调用php
先主要介绍php脚本循环执行方案:
方案1:
脚本中的代码循环执行。这种方法会占系统资源, 长时间运行,会有一些意想不到的隐患。比如内存管理方面的问题 。
eg:

//文件config.php
<?php
	return true;


//文件test.php
<?php
	ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.  
	set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去,避免超时报错 
	$times=5;// 每隔5秒运行一次
	do{
		$run = include 'config.php';//开关
		if($run){
			echo time().'<br>';
			ob_flush();//将数据从php的buffer中释放出来
			flush();//将释放出来的数据发送给浏览器,这里必须要有这两个函数,不然无法输出时间戳,因为该脚本一直未执行完,具体可以参考http://blog.csdn.net/qq_21386275/article/details/65634786
			sleep($times);// 等待5秒
		}else{
			die('end');
		}
	}while(true);

方案二:
循环执行脚本,而不是脚本中的代码。
eg:

<?php
$isOn = 0;//开关
if($isOn){
	$time=2;
	$url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 
	echo time();
	//这里不需要下边两个函数,因为每一次echo都是脚本已经执行完了,具体参考http://blog.csdn.net/qq_21386275/article/details/65634786
	//ob_flush();
	//flush();
	sleep($time);
	echo "<script language='javascript' type='text/javascript'>";  
	echo "window.location.href='$url'";  
	echo "</script>";
	//file_get_contents($url);  //实际循环脚本使用该函数或者curl函数
}else{
	die('end');
}

方案三
crontab定时任务
**1、**安装crontab

yum -y install vixie-cron
yum -y install crontabs

说明:
vixie-cron 软件包是 cron 的主程序;
crontabs 软件包是用来安装、卸载、或列举用来驱动 cron 守护进程的表格的程序。

**2、**配置
cron 是 linux 的内置服务,但它不自动启动,可以用以下的方法启动、关闭这个服务:

service crond start     //启动服务
service crond stop      //关闭服务
service crond restart   //重启服务
service crond reload    //重新载入配置
service crond status    //查看crontab服务状态

在CentOS系统中加入开机自动启动:

chkconfig --level 345 crond on

**3、**定时任务执行时间是写在etc/crontab文件中,下边示例是每天8点到21点,30分,访问百度,定时执行任务的日志是写在var/log/cron文件中的

30 8-21 * * * root curl http://www.baidu.com

**4、**给php添加环境变量
①在/etc/profile文件最后一行添加 export PATH=$PATH:/data/php/bin
②执行source /etc/profile或者./profile让其生效
③执行php -v验证其生效,执行echo $PATH查看其设置的环境变量

**5、**添加定时任务,直接编辑/etc/crontab

29 8-21 * * * root curl http://www.baidu.com
#28 8-21 * * * root /data/php/bin/php /data/html/test.php
#28 8-21 * * * root /data/html/test.php

附:关于crontab相关说明
① /etc/crontab文件说明
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录
②run-parts使用
"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了

01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本

③相关规则说明
这里写图片描述
④cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务
⑤关于crontab权限,相关更深入理解,这里不做阐述,可自行查讯资料,可参考https://www.cnblogs.com/xingzc/p/5969777.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章