pcntl_fork 與 for循環合用

linux腳本後臺化方式

  1. php task.php &
  2. nohup php task.php &
  3. fork 和 setsid *nix解決方案

php多線程與進程

1.使用線程安全版本ZTS
2. 安裝pecl的 【pthread擴展】

php多進程需要在安裝PHP的時候開啓pcntl, 不要在apache或者fpm環境下使用php多進程

php多進程pcntl_fork()來創建多進程

1.子進程與父進程共享程序正文段
2.子進程擁有父進程的數據空間和堆,棧的副本(COW寫時複製)
3.父進程和子進程將繼續執行fork之後的程序代碼((包含pcntl_fork函數)
4.fork之後,父進程與子進程的執行順序無法確認,取決於系統調度

pcntl_fork函數

在父進程中返回子進程的進程ID,在子進程內部返回數字0

代碼

  • pcntl_fork()配合for循環來做些東西 會顯示幾次"sun"代碼?
<?php
        for( $i = 1; $i <= 3 ; $i++ ){
        $pid = pcntl_fork();
        if( $pid > 0 ){
            // do nothing ...
        } else if( 0 == $pid ){
        echo "sun".PHP_EOL;
        }
    }
  • 產生7次而不是3次,但下面會是三次
<?php
        for( $i = 1; $i <= 3 ; $i++ ){
        $pid = pcntl_fork();
        if( $pid > 0 ){
            // do nothing ...
        } else if( 0 == $pid ){
        echo "sun".PHP_EOL;
        exit();
        }
    }

分析

  • i=1的時候父進程的pid不爲0 這時候fork了一個pid=0的子進程a, 子進程數量1
  • i=2的時候父進程fork了一個子進程b, 子進程a又fork了一個子進程c, 子進程數量1+2
  • i=3的時候父進程fork了一個子進程d, a子進程fork了e, b子進程fork了f, c子進程fork了g子進程數量1+2+4=7
  • 至於在fork子進程退出的時候 i=1 =2 =3的時候都只有一個父進程fork一個子進程 所以只有三個兒子

父子進程小結

  • 父生子,子又生子,子子孫孫無窮盡也
  • exit 會讓當前進程斷子絕孫
  • 多進程執行時,程序正文檔是大家的,什麼時候執行哪一段,不確定,由系統調度說了算
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章