1. 程式人生 > >PHP函式pcntl_fork的理解與應用

PHP函式pcntl_fork的理解與應用

PHP程序分支函式

php社群對pcntl_fork的解釋如下

pcntl_fork — 在當前程序當前位置產生分支(子程序)。譯註:fork是建立了一個子程序,父程序和子程序 都從fork的位置開始向下繼續執行,不同的是父程序執行過程中,得到的fork返回值為子程序 號,而子程序得到的是0。
-------
pcntl_fork()函式建立一個子程序,這個子程序僅PID(程序號) 和PPID(父程序號)與其父程序不同。fork怎樣在您的系統工作的詳細資訊請查閱您的系統 的fork(2)手冊。
------
成功時,在父程序執行執行緒內返回產生的子程序的PID,在子程序執行執行緒內返回0。失敗時,在 父程序上下文返回-1,不會建立子程序,並且會引發一個PHP錯誤。

第一次看到這裡,是非常容易迷惑的,寫的示例也看不明白.

其實這裡有一個很簡單的方法可以立即理解這個函式

這裡寫圖片描述
php內部究竟是怎麼處理pcntl_fork的,並不重要,只要理解了這裡pid的值即可.

基於以上,本人寫了一段workman的程序建立程式碼,以供參考

workman的pcntl_fork部分程式碼(精簡)

<?php

$work = new work();
work::forkWorks();
print_r(work::$_works);
print_r(work::$pidMap);

class work {

    public static $_works
= array(); public static $pidMap = array(); public $workId = 0; public $count = 4; // public $masterPid = 0; public function __construct() { $this->workId = spl_object_hash($this);//生成物件的唯一ID self::$_works[$this->workId] = $this; self::$pidMap[$this->workId] = array
(); // $this->masterPid = posix_getpid(); } public static function forkWorks() { foreach (self::$_works as $work) { while (count(self::$pidMap[$work->workId]) < $work->count) { self::forkOne($work); } } } public static function forkOne($work) { $pid = pcntl_fork(); //從這句話執行完,就分成兩個程序,主程序(pid>0)和子程序(pid=0),兩個程序獲取到的pid不同 if ($pid > 0) { self::$pidMap[$work->workId][$pid] = $pid; } elseif ($pid == 0) { self::$_works[$work->workId] = $work; self::$pidMap = array(); while (TRUE){//這裡寫了死迴圈 sleep(1); ECHO 1; } exit; } else { } } }