Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[教程] 终于知道为什么ss7.0的计划任务不执行了。

[复制链接]
ziwu85 发表于 2009-11-7 17:02:29 | 显示全部楼层 |阅读模式
本帖最后由 ziwu85 于 2009-11-7 19:39 编辑

现象:
  今天自己做了个计划任务,但是狂按立即执行,程序好像就是没有被执行的样子。

原因:
  没办法只能自己分析程序,为什么不执行了。
  一看程序才明白,原来S_ROOT.'./log/cron.lock.log'存在时,5分钟内禁止再执行任何计划任务了。
  到相应位置一看,果然cron.lock.log存在。
  可这个cron.lock.log又是怎么出来的呢?原来是在计划任务执行之前程序先要自动生成cron.lock.log,且在全部计划任务执行完毕再删除它(@unlink($lockfile);)。
  而,我新写的计划任务有问题,执行了一半就停止了。导致cron.lock.log没有被自动删除掉。结果我5分钟内,拼命按立即执行我的代码也执行不到了。
  另外,cron.lock.log的存在,不仅影响立即执行的功能,同样在这5分钟内自动执行的计划任务,也不会被执行了。

解决方法:
  手工删除cron.lock.log文件后,再按立即执行就好使了。

评语:
  这也许是康盛创想防止计划任务二次执行的一种手段。但,是否还能有更好的实现方法呢?或者说5分钟以后,计划任务还没有完成,是不是就能被二次执行了呢?
  不知道官方是什么看法?

下面是ss7.0计划任务执行的核心函数的原版代码,给大家参考。
  1. //执行计划任务,并更新计划任务CACHE
  2. function runcron($cronid = 0) {
  3.         global $_SGLOBAL, $_SCONFIG, $_SBLOCK, $lang;

  4.         //锁定
  5.         $lockfile = S_ROOT.'./log/cron.lock.log';
  6.         if(file_exists($lockfile)) {
  7.                 if($_SGLOBAL['timestamp'] - filemtime($lockfile) < 300) {//5分钟
  8.                         return;
  9.                 }
  10.         }
  11.         if(@$fp = fopen($lockfile, 'w')) {
  12.                 fwrite($fp, "\n");
  13.                 fclose($fp);
  14.         }

  15.         //读取cron列表缓存
  16.         if(empty($_SGLOBAL['crons'])) return;

  17.         @set_time_limit(1000);
  18.         @ignore_user_abort(TRUE);

  19.         $cronids = array();
  20.         $crons = $cronid ? array($cronid => $_SGLOBAL['crons'][$cronid]) : $_SGLOBAL['crons'];

  21.         if(empty($crons) || !is_array($crons)) return;

  22.         foreach($crons as $id => $cron) {
  23.                 if($cron['nextrun'] <= $_SGLOBAL['timestamp'] || $id == $cronid) {
  24.                         $cronids[] = $id;
  25.                         if(!@include S_ROOT.($cronfile = "./include/cron/$cron[filename]")) {
  26.                                 errorlog('CRON', $cron['name']." : Cron script($cronfile) not found or syntax error", 0);
  27.                         }
  28.                 }
  29.         }

  30.         cronnextrun($cronids);

  31.         @unlink($lockfile);
  32. }
复制代码
 楼主| ziwu85 发表于 2009-11-7 18:06:51 | 显示全部楼层
有空的话,我会来写一些ss内核代码分析的文章。
希望大家继续关注我的贴子。:)

另外,关于ss核心代码的问题,大家也可以发帖向我提问。
只要我看过的代码,我会在有时间的时候给大家做解答。:)
回复

使用道具 举报

goldlink 发表于 2009-11-8 17:46:32 | 显示全部楼层
.
回复

使用道具 举报

goldlink 发表于 2009-11-12 13:16:37 | 显示全部楼层
.
回复

使用道具 举报

saleroad 发表于 2009-11-12 18:41:46 | 显示全部楼层
牛。
对代码不懂。
回复

使用道具 举报

aq10 发表于 2009-12-11 18:04:54 | 显示全部楼层
回复 2# ziwu85


    帮咱看看这个问题是怎么回事,先谢谢啦
https://discuz.dismall.com/viewth ... 6%BB%AE%C8%CE%CE%F1
回复

使用道具 举报

mingzepeng 发表于 2010-6-6 12:45:12 | 显示全部楼层
lz,我好像遇到和你类似的问题
回复

使用道具 举报

tthcw 发表于 2010-8-22 15:27:43 | 显示全部楼层
www.tthcw.com
回复

使用道具 举报

aq10 发表于 2010-12-20 15:25:27 | 显示全部楼层
顶一下~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-16 14:21 , Processed in 0.055496 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表