public static function parse($configFile)
{
self::$_tmpPrefix = 0;
self::$_tmpData = array();
$cacheKey = "SConfig_Cache_" . md5(realpath($configFile));
if (self::$CACHE) {
if (isset(self::$_result[$cacheKey])) {
return self::$_result[$cacheKey];
}
$tmp_file = self::_tmpDir() . "/" . self::$_tmpPrefix . $cacheKey;
if (is_file($tmp_file) && filemtime($tmp_file) >= filemtime($configFile)) {
$result = unserialize(file_get_contents($tmp_file, false));
self::$_result[$cacheKey] = $result;
return $result;
}
}
$content = file_get_contents($configFile, false);
//去掉注释,#号表示注释
$content = preg_replace("/^(\\s*)#(.*)/m", "", $content);
//保存临时变量,单引号,双引号里特殊字符
$content = preg_replace_callback("/(\\S+?)[\\s:]+([\\'\"])(.*?)\\2;/m", array("SConfig", "_tmpData"), $content);
//获取最直接的k,v值
$result = self::_getKV($content);
self::_split($content, $result);
if (self::$CACHE) {
file_put_contents($tmp_file, serialize($result), LOCK_EX);
self::$_result[$cacheKey] = $result;
}
return $result;
}
<?php error_reporting(E_ALL ^ E_NOTICE); include "../www/global.php"; chdir(dirname(__FILE__)); SLog::$LOGFILE = "log/run.log"; SConfig::$CACHE = false; $info = array(); for (;;) { usleep(1000 * 500); $config = SConfig::parse("backend.conf"); foreach ($config as $conf) { if (!empty($conf->app) || !empty($conf->interval)) { if (empty($info[$conf->app]['starttime']) || $info[$conf->app]['starttime'] + $conf->interval <= time()) { $info[$conf->app]['starttime'] = time(); $fname = _tmpDir() . "/crontab.pid." . $info[$conf->app]['pid']; if (!empty($info[$conf->app]['pid']) && file_exists($fname)) { $fp = fopen($fname, "r"); if (flock($fp, LOCK_SH | LOCK_NB) == false) { //上次运行的进程还没有结束 fclose($fp); continue; } fclose($fp); } $ret = pcntl_fork(); $command = $conf->app; if (!empty($conf->params)) { $params = $conf->params; } else { $params = new stdclass();