由于PHP只能被用户触发,被调用,调用后会自动退出内存,没有常驻内存。所以实现定时任务都是循环的执行某一个脚本。
PHP定时任务实现主要有两个方向:
1、循环脚本本身或脚本中代码循环执行
2、服务器定时调用php
先主要介绍php脚本循环执行方案:
方案1:
脚本中的代码循环执行。这种方法会占系统资源, 长时间运行,会有一些意想不到的隐患。比如内存管理方面的问题 。
eg:
//文件config.php<?phpreturn true;//文件test.php<?phpignore_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();//将释放出来的数据发送给浏览器,这里必须要有这两个函数,不然无法输出时间戳,因为该脚本一直未执行完,具体可以参考/qq_21386275/article/details/65634786sleep($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都是脚本已经执行完了,具体参考/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-cronyum -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
**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 #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权限,相关更深入理解,这里不做阐述,可自行查讯资料,可参考/xingzc/p/5969777.html