由于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