<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ~~~ <?php /** * Created by PhpStorm. * User: Mikkle * QQ:776329498 * Date: 2017/06/19 * Time: 10:14 */ namespace mikkle\tp_worker; use mikkle\tp_master\Command; use mikkle\tp_master\Exception; use mikkle\tp_master\Log; /** * Created by PhpStorm. * Power by Mikkle * QQ:776329498 * Date: 2017/6/12 * Time: 15:07 */ abstract class WorkerCommand extends Command { protected $sleep = 5; protected $redis; protected $listName; protected $pcntl; public function __construct($name = null) { $this->redis = $this->redis(); $this->listName = "worker_list"; $this->pcntl = true; parent::__construct($name); } protected function configure() { $this->setName('mikkle')->setDescription('Here is the mikkle\'s command '); } protected function executeHandle($input, $output) { while (true) { //標記后端服務運行中 $this->signWorking(); echo "==================================================" . PHP_EOL; $this->autoClass(); echo "==================================================" . PHP_EOL; $this->sleep(); } } /** * 自動執行 * Power: Mikkle * Email:776329498@qq.com * @return bool */ protected function autoClass() { $works = $this->getWorks(); if ($works) { foreach ($works as $work => $item) { if ($this->pcntl) { $this->pcntlWorker($work, $item); } else { $this->runWorker($work, $item); } } } else { return false; } } public function getWorks() { try { return $this->redis->hget($this->listName); } catch (Exception $e) { return false; } } /** * 檢測執行方法是否存在 * Power: Mikkle * Email:776329498@qq.com * @param $work * @param $item * @return bool */ protected function checkWorkerExists($work, $item) { if (class_exists($work)) { if (method_exists($work, $item)) { return true; } else { return false; } } } /** * 運行任務 * Power: Mikkle * Email:776329498@qq.com * @param $work * @param $item */ protected function runWorker($work, $item) { try { if ($this->checkWorkerExists($work, $item)) { echo "執行[{$work}]任務" . PHP_EOL; $work::$item(); Log::notice("執行[{$work}::{$item}]任務"); } elseif ($this->checkWorkerExists($work, "run")) { echo "執行[{$work}]任務" . PHP_EOL; $work::run(); Log::notice("執行[{$work}::run]任務"); } else { echo "執行[{$work}::{$item}]任務的默認和指定方法都不存在" . PHP_EOL; $this->redis->hdel($this->listName, $item); } } catch (Exception $e) { echo "執行[{$work}]任務失敗" . PHP_EOL; Log::notice($e->getMessage()); if ($this->pcntl) { $this->pcntlKill(); } } } /** * 分進程 * Power: Mikkle * Email:776329498@qq.com * @param $work * @param $item */ protected function pcntlWorker($work, $item) { try { // 通過pcntl得到一個子進程的PID $pid = pcntl_fork(); if ($pid == -1) { // 錯誤處理:創建子進程失敗時返回-1. die ('could not fork'); } else if ($pid) { // 父進程邏輯 // 等待子進程中斷,防止子進程成為僵尸進程。 // WNOHANG為非阻塞進程,具體請查閱pcntl_wait PHP官方文檔 pcntl_wait($status, WNOHANG); } else { // 子進程邏輯 $pid_2 = pcntl_fork(); if ($pid_2 == -1) { // 錯誤處理:創建子進程失敗時返回-1. die ('could not fork'); } else if ($pid_2) { // 父進程邏輯 echo "父進程邏輯開始" . PHP_EOL; // 等待子進程中斷,防止子進程成為僵尸進程。 // WNOHANG為非阻塞進程,具體請查閱pcntl_wait PHP官方文檔 pcntl_wait($status, WNOHANG); echo "父進程邏輯結束" . PHP_EOL; } else { // 子進程邏輯 echo "子進程邏輯開始" . PHP_EOL; $this->runWorker($work, $item); echo "子進程邏輯結束" . PHP_EOL; $this->pcntlKill(); } $this->pcntlKill(); } } catch (Exception $e) { Log::error($e->getMessage()); } } /** * Kill子進程 * Power: Mikkle * Email:776329498@qq.com */ protected function pcntlKill() { // 為避免僵尸進程,當子進程結束后,手動殺死進程 if (function_exists("posix_kill")) { posix_kill(getmypid(), SIGTERM); } system('kill -9 ' . getmypid()); exit (); } public function signWorking() { $this->redis()->set("command", "true"); $this->redis()->setExpire("command", 30); } public function sleep($second = "") { $second = $second ? $second : $this->sleep; // echo "開始睡眠{$second}秒!當前時間:" . date('h:i:s') . PHP_EOL; sleep(sleep($second)); //TP5的命令行 sleep($second) 不生效 echo "睡眠{$second}秒成功!當前時間:" . date('h:i:s') . PHP_EOL; } /** * @return int */ public function getSleep() { return $this->sleep; } /** * @param int $sleep * @return void */ public function setSleep($sleep) { $this->sleep = $sleep; } /** * @title redis * @description redis加載自定義Redis類 * User: Mikkle * QQ:776329498 * @return \mikkle\tp_redis\Redis */ protected static function redis() { return WorkerRedis::instance(); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看