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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## php的多進程實驗分析 >[tip] 由于時間久遠,本文不再具有參考性,請參閱更為易讀新文章:[進程 · php筆記 · 看云](http://www.hmoore.net/xiak/php-node/785180) pcntl_fork — 在當前進程當前位置產生分支(子進程)。譯注:fork是創建了一個子進程,父進程和子進程 都從fork的位置開始向下繼續執行,不同的是父進程執行過程中,得到的fork返回值為子進程 號,而子進程得到的是0。 ```php <?php fwrite(STDOUT, "stat>" . PHP_EOL.PHP_EOL); $count = 3; for ($i = 0; $i < $count; $i++) { $pid = pcntl_fork(); if($pid == -1) { fwrite(STDOUT, "Could not fork worker {$i}" . PHP_EOL); die(); } else if(!$pid) { fun($i, $count); // 如果不使用下面的方式退出,將會出現什么呢,經測試,下面是我們得出的結果。 // break; // exit; } else { fwrite(STDOUT, "父進程 " . $i . PHP_EOL); } } function fun($i, $count) { // global $num; $num = $i; $jc = exec('echo $$'); $time = date('Y-m-d H:i:s'); fwrite(STDOUT, "進程:$jc 計數:$num - $count 時間:$time" . PHP_EOL); fwrite(STDOUT, "start > " . date('Y-m-d H:i:s') . PHP_EOL); fwrite(STDOUT, "~ 3s ~" . PHP_EOL); sleep(3); fwrite(STDOUT, "enddd $i < " . date('Y-m-d H:i:s') . PHP_EOL.PHP_EOL); } ``` 父進程循環 從0開始 3次 創建3個子進程 產生下面第一部分 i = 0/1/2 結束循環 子0進程下面的循環 從1開始循環 能循環2次 創建2個子進程 產生下面第二部分(由第一子進程產生) 和 第三部分(由第二子進程產生) 子1進程下面的循環 從2開始循環 能循環1次 創建1個子進程 產生下面第四部分 子2進程下面的循環 沒有循環 退出了(什么都沒做) 由此分析可見PHP的這個子進程機制的特點: 繼承父進程的“運行上下文”即變量和環境都是直接繼承了,并且各個子進程相互,不受影響。 ~~~ [root@iZ28yn5lehbZ x]# x=sf php d3.php stat> 父進程 0 父進程 1 父進程 2 進程:25608 計數:0 - 3 時間:2016-08-15 08:35:47 start > 2016-08-15 08:35:47 ~ 3s ~ 進程:25610 計數:2 - 3 時間:2016-08-15 08:35:47 start > 2016-08-15 08:35:47 ~ 3s ~ 進程:25611 計數:1 - 3 時間:2016-08-15 08:35:47 start > 2016-08-15 08:35:47 ~ 3s ~ enddd 1 < 2016-08-15 08:35:50 enddd 2 < 2016-08-15 08:35:53 enddd 0 < 2016-08-15 08:35:50 父進程 1 父進程 2 進程:25643 計數:1 - 3 時間:2016-08-15 08:35:50 start > 2016-08-15 08:35:50 ~ 3s ~ 進程:25644 計數:2 - 3 時間:2016-08-15 08:35:50 start > 2016-08-15 08:35:50 ~ 3s ~ enddd 1 < 2016-08-15 08:35:53 enddd 2 < 2016-08-15 08:35:53 父進程 2 進程:25646 計數:2 - 3 時間:2016-08-15 08:35:50 start > 2016-08-15 08:35:50 ~ 3s ~ enddd 2 < 2016-08-15 08:35:50 父進程 2 進程:25663 計數:2 - 3 時間:2016-08-15 08:35:53 start > 2016-08-15 08:35:53 ~ 3s ~ enddd 2 < 2016-08-15 08:35:56 ~~~ php獲取子進程ID ``` $jc = exec('echo $$'); // 這方式獲取的不是當前PHP腳本執行的進程ID $child_id = getmypid(); // 這個才是當前PHP腳本執行的進程ID ``` 參見:https://segmentfault.com/q/1010000004634861 ``` 父進程:17488 字進程:17489 計數:0 父進程:17488 字進程:17490 計數:1 進程:17489 計數:0 - 3 時間:2016-08-15 16:55:22 start > 2016-08-15 16:55:22 ~ 3s ~ 父進程:17488 字進程:17491 計數:2 進程:17490 計數:1 - 3 時間:2016-08-15 16:55:22 start > 2016-08-15 16:55:22 ~ 3s ~ 進程:17491 計數:2 - 3 時間:2016-08-15 16:55:22 start > 2016-08-15 16:55:22 ~ 3s ~ [root@iZ28yn5lehbZ x]# enddd 0 < 2016-08-15 16:55:25 enddd 1 < 2016-08-15 16:55:25 enddd 2 < 2016-08-15 16:55:25 ``` 上面這個父進程執行部分是否先輸出來,有時并無實際規律,理論上和實際上不一樣,原因是可能需要考慮進程在CPU資源分配使用上面。(但好像父進程 計數:0永遠在第一,也就是說在這個開辟子進程的結構中,父進程是首次執行的。) ``` $status = ''; $pid = pcntl_fork(); //父進程和子進程都會執行下面代碼 if ($pid == -1) { //錯誤處理:創建子進程失敗時返回-1. die('could not fork'); } else if ($pid) { //父進程會得到子進程號,所以這里是父進程執行的邏輯 // pcntl_wait($status); //等待子進程中斷,防止子進程成為僵尸進程。 fwrite(STDOUT, "父進程" . PHP_EOL); } else { //子進程得到的$pid為0, 所以這里是子進程執行的邏輯。 fwrite(STDOUT, "子進程" . PHP_EOL); } ``` **分析** 1. 父進程執行完畢就退出了,但是這個退出不會結束可能還沒執行完成的子進程,也就是說子進程會變成僵尸進程,這并不像結束了ssh就結束了bash,就結束了我們的腳本那樣。(這個也確實是要成為僵尸進程,不然孩子剛生出來還沒玩夠就要死了) 2. 輸出順序為: 父進程 子進程 如果將pcntl_wait這一行注釋掉,輸出順序就為 子進程 父進程 **測試:** 父進程和子進程 都從fork的位置開始向下繼續執行,所以這個硬要說規律也不好說,這個是CPU指令執行資源的事了。 ![](https://box.kancloud.cn/2016-08-17_57b4207ea01ac.png) * * * * * ### 擴展 [從 0 到 1 優雅的實現PHP多進程管理](https://mp.weixin.qq.com/s/lbGCQu7zkKUfPhFMFbHooQ) [TIGERB/naruto: An object-oriented multi process manager for PHP](https://github.com/TIGERB/naruto) * * * * * last update:2017-12-18 14:55:26
                  <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>

                              哎呀哎呀视频在线观看