php中pcntl_fork建立子進程

1、php中pcntl_fork函數概述

  1. pcntl_fork()函數是php中用於建立子進程的一個函數,返回建立的子進程的pid。
  2. 該函數建立子進程具體fork的過程:php

    (1)調用該函數即建立一個子進程,建立成功父進程返回子進程的pid,子進程返回0;
    (2)建立子進程實際上對父進程的一個拷貝,共享代碼空間,拷貝父進程的數據,也就是說父進程改變父進程的數據,子進程改變子進程的數據變量等;

2、示例代碼分析

  1. 代碼示例:併發

    <?php
       $curr_pid = posix_getpid();//獲取當前的進程id
       
       //將當前進程的id寫入文件中
       echo '當前進程:'.$curr_pid.PHP_EOL;
       
       //開始建立子進程
       $son_pid = pcntl_fork();//返回子進程的id
      
       //查看當前進程
       echo '建立子進程以後當前的進程爲:'.posix_getpid().PHP_EOL;
       
       //建立了子進程以後
       if($son_pid > 0){
           //父進程fork成功返回子進程的id,此爲父進程的執行邏輯
           echo '子進程id:'.$son_pid.PHP_EOL;
       }elseif($son_pid = 0){
           //子進程fork後返回的pid是0,所以爲子進程執行邏輯
       }else{
           //$son_pid=-1的時候,表明fork子進程失敗
       }
  2. 以上代碼執行後結果爲:

    clipboard.png

  3. 示例代碼分析:函數

    (1)發現建立了子進程以後,系統會切換到子進程中,而子進程中的代碼是從含有pcntl_fork函數的那行執行的
    (2)建立子進程以後,子進程的代碼段是拷貝pcntl_fork函數及以後的代碼段,以前的代碼段並不拷貝,可是具體的數據變量子進程仍然會拷貝
    (3)可見,fork以後程序會分叉執行,即子進程執行

3、pcntl_fork的業務場景舉例

  1. php的多進程中,經常使用pcntl_fork來實現併發,多用於一些簡單工具的實現。
  2. 例如監控工具,想要監控幾個不一樣指標的情形,能夠使用主進程監控各指標的配置變化,而後對每一個指標分別fork一個子進程來監控其具體的情形,當主進程發現指標的配置改變則kill掉以前的子進程從新建立子進程進行監控。
  3. 主進程進行業務分發操做,子進程進行具體的業務邏輯執行。
相關文章
相關標籤/搜索