PHP-PHP中的定时任务如何实现?
PHP中的定时任务是如何实现的。如drupal中的定时自动清理缓存。
如何停止呢?重启?
可以在程序里设置条件,达到某个条件就跳出循环。
/***cron-config.php***/
<?php
$cron_config['run']="true";
?>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
<?
set_time_limit(0);
ignore_user_abort(true);
$i=1;
while($i){
/*
处理事务
*/
sleep(120);
}
exit;
?>
打开他后,直接关掉就可以了,他会在服务器端执行因为你在循环里面是停了两分种了,所以他等于说是2分种执行一下那个处理事务处的代码,不知道这是不是你需要的.呵呵
这里也有相关回答 @PHP怎么写定时任务?,用到的函数 ignore_user_abort(),set_time_limit(0),sleep($interval)
此代码只要运行一次后关闭浏览器即可。
下面是我用上面的方法写的一个监控。
个人感觉 uchome 里面的计划任务不错, 是通过 用户来触发的
这个文件在 source/function_cron.php 你可以读一下
下面我把他的代码贴出来
//执行计划任务
function runcron($cronid = 0) {
global $_SGLOBAL, $_SCONFIG, $_SBLOCK, $_TPL, $_SCOOKIE, $_SN, $space;
$where = $cronid ? "cronid='$cronid'" : "available>'0' AND nextrun<='$_SGLOBAL[timestamp]'";
$query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('cron')." WHERE $where ORDER BY nextrun LIMIT 1");//只运行一个
if($cron = $_SGLOBAL['db']->fetch_array($query)) {
$lockfile = S_ROOT.'./data/runcron_'.$cron['cronid'].'.lock';
$cronfile = S_ROOT.'./source/cron/'.$cron['filename'];
if(is_writable($lockfile)) {
$locktime = filemtime($lockfile);
if($locktime > $_SGLOBAL['timestamp'] - 600) {//10分钟
return NULL;
}
} else {
@touch($lockfile);
}
@set_time_limit;
@ignore_user_abort(TRUE);
cronnextrun($cron);
if(!@include $cronfile) {
runlog('CRON', $cron['name'].' : Cron script('.$cron['filename'].') not found or syntax error', 0);
}
@unlink($lockfile);
}
//更新config
cron_config();
}
用到的函数 ignore_user_abort(),set_time_limit(0),sleep($interval)
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去
$interval=60*30;// 每隔半小时运行
do{
//这里是你要执行的代码
sleep($interval);// 等待5分钟
}while(true);
推荐看下这篇文章:
php计划任务
有几个方法:
1.使用ignore_user_abort(true)来设置当用户请求中断后,继续执行脚本。discuz里面有一个使用ignore_user_abort实现的cron类,可以拿来参考一下。
2.如果有fsockopen权限,可以使用fsockopen("127.0.0.1", 80, $errno, $errstr, 30);来让服务器脚本请求自己的脚本:
上面的代码让其反复请求一个接口就行,这个要注意拿一个数据库来标示cron是否在运行中
3.如果PHP是用 fastcgi 方式运行的,可以用 fastcgi_finish_request() 函数提前终止HTTP请求,然后后面用循环+sleep实现cron的功能。