pop(); /**if ($cron = $process->pop()) { if (is_string($cron) && $cron) { var_dump($cron); //$cron = unserialize($cron); $this->beforeTask($process->pid); //$cron->run(); $this->afterTask($process->pid); //$process->push('from process' . $process->pid); } }*/ pcntl_signal_dispatch(); sleep(1); // 如果收到安全退出的信号,需要在最后任务处理完成之后退出 if ($quit) { $process->exit(0); } } }; } /** * 进程信息 * * @time 2020年07月05日 * @param $process * @return array */ protected function processInfo($process) { return [ 'name' => $process, 'pid' => $process->pid, 'status' => self::WAITING, 'start_at' => time(), 'deal_num' => 0, 'error' => 0, ]; } /** * 是否有等待的 Process * * @time 2020年07月07日 * @return array */ protected function hasWaitingProcess() { $waiting = [false, null]; foreach ($this->process as $process) { if ($process['status'] == self::WAITING) { $waiting = [true, $process['name']]; break; } } return $waiting; } /** * 处理任务前 * * @time 2020年07月07日 * @param $pid * @return void */ protected function beforeTask($pid) { if (isset($this->process[$pid])) { $this->process[$pid]['status'] = self::BUSYING; } } /** * 处理任务后 * * @time 2020年07月07日 * @param $pid * @return void */ protected function afterTask($pid) { if (isset($this->process[$pid])) { $this->process[$pid]['status'] = self::WAITING; $this->process[$pid]['deal_num'] += 1; } } /** * 退出服务 * * @time 2020年07月07日 * @return void */ public function stop() { \Swoole\Process::kill($this->getMasterPid(), SIGTERM); } /** * 状态输出 * * @time 2020年07月07日 * @return void */ public function status() { \Swoole\Process::kill($this->getMasterPid(), SIGUSR1); } /** * 子进程重启 * * @time 2020年07月07日 * @return void */ public function reload() { \Swoole\Process::kill($this->getMasterPid(), SIGUSR2); } /** * 输出 process 信息 * * @time 2020年07月05日 * @return string */ public function getWorkerStatus() { $scheduleV = self::VERSION; $adminV = CatchAdmin::VERSION; $phpV = PHP_VERSION; $info = <<setHeader([ 'Pid', 'StartAt', 'Status', 'DealTaskNumber', 'Errors' ], 3); $processes = []; foreach ($this->process as $process) { $processes[] = [ 'pid' => $process['pid'], 'start_at' => date('Y-m-d H:i', $process['start_at']), 'status' => $process['status'], 'deal_num' => $process['deal_num'], 'error' => $process['error'], ]; } $table->setRows($processes, 3); $table->render(); return $info . PHP_EOL . $table->render(); } }