/** * 主进程监控部分 */ public function actRun() { // 监控自身进程同时只允许运行一个实例 $this->_checkSelfProc(); //启动记录 File::write($this->_logpath . 'daemon' . DS . 'daemon.log', 'time:' . date('Y-m-d H:i:s') . ',pid' . intval(getmypid()) . PHP_EOL); //写入日志信息 while (true) { //根据队列配置启动队列 $this->_startProc(); sleep(1); } }
/** * 写入debugger日志 * @param array $data 消耗信息 */ public function debugger($data) { $request = \H2O::getContainer('request'); Stdout::title('Debugger Info ' . date('Y-m-d H:i:s')); Stdout::table([['Route', 'RunTime', 'Memory'], [$request->getRequestUri(), $data['runtime'], $data['memory']]]); $logfile = APP_RUNTIME . DS . 'console' . DS . 'debugger' . DS . date('Ymd') . '.log'; //异常日志文件 $content = Stdout::get(); //内容 H2O\helpers\File::write($logfile, $content); //写入日志信息 }
/** * 启动 */ public function actStart() { $routep = $this->_getRoutePath(); //路由规则path $logfile = $this->_logpath . $routep . DS . date('Ymd') . '.log'; //记录日志信息 按天记录 $module = \H2O::getContainer('module'); $route = \H2O\base\Module::parseRoute($routep); //返回路由规则URL //启动时,要删除已产生的停止信号,防止启动时就退出 $this->_deleteSignal($routep); //写入进程信息 $pid = getmypid(); $pidfile = $this->_logpath . $routep . '.pid'; //进程存储文件 File::write($pidfile, $pid . ':' . date('Y-m-d H:i:s') . PHP_EOL); //写入存储信息 //循环业务处理 while (true) { $signal = $this->_getSignal($routep); //获取信号 if ($signal[0] == $this->_stopsignal) { //信号源为停止,并且是当前应用 //清理进程信息 if ($signal[1] == $pid) { $apid = file($pidfile); //读取所有进程信息 $apid = array_filter($apid); //过滤空格 $tmpid = []; foreach ($apid as $ap) { $ap = trim($ap); $opid = substr($ap, 0, strpos($ap, ':')); if ($opid != $pid && !empty($ap)) { $tmpid[] = $ap . PHP_EOL; } } if (empty($tmpid)) { //如果不存进程信息时,直接删除记录进程日志信息 File::remove($pidfile); //删除运行时的日志 } else { File::write($pidfile, implode('', $tmpid), false); //新写入进程日志 } } else { File::remove($pidfile); //删除运行时的日志 } exit; } else { $octr = $module->getController($route['controller']); //控制器对象 $gwmethod = 'Gate' . ucfirst($route['action']); //方法网关 if (method_exists($octr, $gwmethod)) { //增加入口应用关口,可在此函数中处理业务逻辑,可实现定时任务等 if ($octr->{$gwmethod}()) { //返回值只有为true时才执行相应的程序 $res = $octr->runAction(ucfirst($route['action'])); //执行操作 $content = 'pid:' . $pid . ' datetime:' . date('Y-m-d H:i:s') . ' response:' . $res . PHP_EOL; File::write($logfile, $content); //写入日志信息 } } else { $res = $octr->runAction(ucfirst($route['action'])); //执行操作 $content = 'pid:' . $pid . ' datetime:' . date('Y-m-d H:i:s') . ' response:' . $res . PHP_EOL; File::write($logfile, $content); //写入日志信息 } } sleep(1); //休眠时间 1秒 } }
/** * 数据切割队列 * @param array $field 需要格式化的字段,例如 ['A'=>['name'],'B'=>['rdate'=>'time']] * @param int $cn 每个切割文件行数 默认为1万条为一个 * @return array 切分的文件队列信息 */ public function QueueData($field, $cn = 10000) { $data = []; $dirs = PHPEXCEL_CACHE_DIR . DS . md5($this->_file); //文件块目录 $filei = 1; //文件切分数 $filequeue = []; //清空之前的队列信息 for ($row = 2; $row <= $this->_rows; $row++) { //行数是以第1行开始 $data[] = $this->_paserColsData($field, $row); $line = $row - 2; if ($line % $cn == 0 && $line > 0) { $file = $dirs . DS . $filei . '.swp.php'; $filequeue[] = $file; //写入到文件队列中 $content = "<?php\n return " . var_export($data, TRUE) . ";\n?>"; File::write($file, $content, false); //写入缓存信息 $data = []; //清空之前的数据 $filei++; } } //处理剩余的 if (!empty($data)) { $file = $dirs . DS . $filei . '.swp.php'; $filequeue[] = $file; //写入到文件队列中 $content = "<?php\n return " . var_export($data, TRUE) . ";\n?>"; File::write($file, $content, false); //写入缓存信息 } return $filequeue; }