Ejemplo n.º 1
0
 /**
  * 主进程监控部分
  */
 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);
     }
 }
Ejemplo n.º 2
0
 /**
  * 写入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);
     //写入日志信息
 }
Ejemplo n.º 3
0
 /**
  * 启动
  */
 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秒
     }
 }
Ejemplo n.º 4
0
 /**
  * 数据切割队列
  * @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;
 }