PHP-PHP中的定时任务如何实现?

PHP-PHP中的定时任务如何实现?

浮生未歇 发布于 2016-10-28 字数 237 浏览 1153 回复 6

PHP中的定时任务是如何实现的。如drupal中的定时自动清理缓存。

如何停止呢?重启?

可以在程序里设置条件,达到某个条件就跳出循环。

/***cron-config.php***/
<?php
$cron_config['run']="true";
?>

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

想挽留 2017-09-24 6 楼

<?  
  set_time_limit(0);  
  ignore_user_abort(true);  
 $i=1;
  while($i){  
  /*  
  处理事务  
  */  
  sleep(120);  
  }  
  exit;  
  ?>  
打开他后,直接关掉就可以了,他会在服务器端执行因为你在循环里面是停了两分种了,所以他等于说是2分种执行一下那个处理事务处的代码,不知道这是不是你需要的.呵呵

虐人心 2017-08-31 5 楼

这里也有相关回答 @PHP怎么写定时任务?,用到的函数 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);

下面是我用上面的方法写的一个监控。

ini_set("error_reporting","E_ALL & ~E_NOTICE");
function_exists('date_default_timezone_set') && date_default_timezone_set('Etc/GMT-8');
$stime = date("n月j日 H:i:s");
//即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
ignore_user_abort();
// 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去
set_time_limit(0);
// 每隔5分钟运行
$interval=60*5;
do{
  /* 监控的网址 */
  $host ='www.baidu.com';
  /* 下面的是网站首页源代码中的一段特殊字符串 */
  $find ='baidu';
  if (!check($host,$find)){
    alert($host);
  }
  file_put_contents('put.txt',' Current Time: '.$stime);
  if( $stop == 500 ) break;
  // 等待5分钟
  sleep($interval);
}while(true);

function check($host,$find){
  $fp =fsockopen($host, 80,$errno,$errstr, 10);
  if (!$fp) {
    echo "$errstr ($errno)n";
  } else {
    $header ="GET / HTTP/1.1rn";
    $header .="Host: $hostrn";
    $header .="Connection: closernrn";
    fputs($fp,$header);  
    while (!feof($fp)) {
      @$str .=fgets($fp, 1024);
    }
    fclose($fp);
    return (strpos($str,$find) !== false);
  }
}

function alert($host){
  mail('admin@office.net','监控项目 [a] 故障通知','监控项目 [yaoinfo( '.$host.' )] 于 '.$stime.' 不可用(无法连接服务器)');
}
function alertok($host){
  mail('admin@office.net','监控项目 [b] 可用(200 OK)','监控项目 [yaoinfo( '.$host.' )] 于 '.$stime.' 可用(200 OK)');
}
虐人心 2017-08-19 4 楼

个人感觉 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();
}

瑾兮 2017-08-12 3 楼

用到的函数 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);

灵芸 2017-08-11 2 楼

推荐看下这篇文章:

php计划任务

晚风撩人 2017-02-25 1 楼

有几个方法:

1.使用ignore_user_abort(true)来设置当用户请求中断后,继续执行脚本。discuz里面有一个使用ignore_user_abort实现的cron类,可以拿来参考一下。
2.如果有fsockopen权限,可以使用fsockopen("127.0.0.1", 80, $errno, $errstr, 30);来让服务器脚本请求自己的脚本:

$fp = fsockopen("127.0.0.1", 80, $errno, $errstr, 30);
if($fp){
$out = "GET /?act=XXXX HTTP/1.1rn";
$out .= "Host: ".$_SERVER['HTTP_HOST']."rn";
$out .= "Cookie:PHPSESSID=xxxxxxrn";
$out .= "Connection: Closernrn";        
fputs($fp, $out);
}

上面的代码让其反复请求一个接口就行,这个要注意拿一个数据库来标示cron是否在运行中

3.如果PHP是用 fastcgi 方式运行的,可以用 fastcgi_finish_request() 函数提前终止HTTP请求,然后后面用循环+sleep实现cron的功能。