本帖最后由 liuzhly 于 2010-01-05 12:42 编辑
function_cron.php 修改如下代码:
//执行计划任务
function runcron($cronid = 0,$auto=0) {
global $_SGLOBAL, $_SCONFIG, $_SBLOCK, $_TPL, $_SCOOKIE, $_SN, $space;
include_once(S_ROOT.'./auto_cron.lock');
if($auto == 0 && $cronid == 0){ //代表后台运行,时间是自动运行时间差小于600
if(defined('AUTO_CRON')) {
if($_SGLOBAL[timestamp] - AUTO_CRON < 600){return NULL;}
}
}
$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(1000);
@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();
}
主要思想:如果后台程序运行中,那么用户就不用打开页面时候执行计划任务,如果后台不运行,那么用户打开页面就会执行计划任务 ,判断时间差是10分钟
然后在UCHOME目录下建立两个文件
auto_cron.php
auto_cron.lock //手动建立即可,可为空
auto_cron.php内容:
<?php
header ( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
header ( "Last-Modified: " . gmdate ( "D, d M Y H:i:s" ) . " GMT" );
header ( "Cache-Control: no-store, no-cache, must-revalidate" );
header ( "Cache-Control: post-check=0, pre-check=0", false );
header ( "Pragma: no-cache" );
/*
[UCenter Home] (C) 2007-2008 Comsenz Inc.
$Id: admincp.php 13141 2009-08-13 01:48:28Z xupeng $
*/
include_once('./common.php');
include_once(S_ROOT.'./source/function_cron.php');
$atimestamp = $_SGLOBAL[timestamp];
runcron(0,1);
$autofile = S_ROOT.'auto_cron.lock';
$autotext = "<?php\r\ndefine('AUTO_CRON', {$atimestamp});\r\n\r\n?>";
if(swritefile($autofile, $autotext)){
$atimestamp = date('Y-m-d H:i:s', $atimestamp);
$mess_ = "[{$atimestamp}] OK,本次运行完毕";
}else{
$mess_ = "文件写入错误";
}
?>
然后输入 在服务器上使用程序刷新这个文件吧...
附件提供替换文件 !!
主要目的:减轻客户端压力,减少计划任务出错机会!!!
注意,蓝色代码今天刚改进的,加上后可手动运行了,原来忘记判断了,12月3日最新修改为蓝色字体,请自己加上吧,不好意思!附件我就不更新了,下载完毕自己修改一下就OK
=============2010年01月05日最新修改============
2003 IIS 可用!
用此红色代码存成VBS替代 start.bat 或者 HTML ,注意在 auto_cron.php 最顶上加代码如下蓝色代码用户VBS判断网页状态!
<TITLE>New Document</TITLE>
红色代码开始:
On Error Resume Next
Set Wshell=WScript.CreateObject("WScript.Shell")
Set ie=WScript.CreateObject("InternetExplorer.Application")
Dim rcount
rcount=0
ie.visible=false
WScript.Sleep 60000 '暂停60000毫秒
Do While True
ie.navigate "http://uc.yt.sd.sgcc.com.cn/auto_cron.php" '用IE打开自动运行网页
wscript.sleep 133000 '休眠133秒
If rcount=10 Then
Wshell.run "shutdown -r -t 10 -c ""Restart Computer""",0 '发现10次错误重新启动计算机
Exit Do
End If
If ie.document.title <> "New Document" Then '如果网页无法访问,重启iis
rcount=rcount+1
Wshell.Run "%COMSPEC% /c IISRESET.EXE",,1
WScript.Sleep 300000 '暂停300秒,IIS重新启动
End If
Loop
将代码存成start.vbs 用于监控网站,由于经常使用农场导致IIS假死,可用此方法自动重启! |