<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>

                # 案例:實現一個Master、Worker的進程 背景:在編寫服務端程序的時候單進程的消費速度跟不上,這時候可以選擇多進程來操作,選擇多進程為了防止進程死掉導致任務無法執行,所以采用Master、Worker進程模型實現一個進程管理。 ```php <?php class SunnyProcess{ // Master進程id protected static $masterPid; // Worker進程id集合 protected static $workerPid = []; /** * 設置進程名稱 * @String $name 進程名稱 */ public static function setProcessTitle($name){ if (extension_loaded('proctitle') && function_exists('setproctitle')) { @setproctitle($name); } elseif (version_compare(phpversion(), "5.5", "ge") && function_exists('cli_set_process_title')) { @cli_set_process_title($name); } } /** * 創建Worker進程 * @Int $num Worker進程數量 */ public static function forkWorker($num = 2){ for($i=0;$i<$num;$i++){ $pid = pcntl_fork(); if($pid>0){ // 父進程,把子進程id存到進程集合 static::$workerPid[$pid] = $pid; }elseif($pid===0){ // 子進程 static::setProcessTitle("php:worker"); while(1){ // 獲取當前進程id $pids = posix_getpid(); $time = microtime(true); $masterpid = static::$masterPid; echo "主進程:{$masterpid},當前進程:{$pids},當前時間:{$time}\n"; sleep(1); } }else{ exit('進程啟動失敗\n'); } } } /** * Master進程監控Worker進程 */ public static function monitor(){ while(true){ // 掛起當前進程的執行直到一個子進程退出或接收到一個信號 $status = 0; // 使用pcntl_wait掛起當前進程,掛起之后會阻塞不執行pcntl_wait之后的代碼 // 直到pcntl_wait返回pid $pid = pcntl_wait($status, WUNTRACED); var_dump($pid);//這段代碼往后的代碼只有在pcntl_wait有觸發的時候才會調用 pcntl_signal_dispatch(); if ($pid >= 0) { // worker健康檢查 unset(static::$workerPid[$pid]); echo "worker檢查:{$pid}\n"; static::forkWorker(1); print_r(static::$workerPid);echo "\n"; } } } public static function runAll(){ static::setProcessTitle("php:master"); static::$masterPid = posix_getpid(); static::forkWorker(3); static::monitor(); } } SunnyProcess::runAll(); ```
                  <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>

                              哎呀哎呀视频在线观看