要想寫出一個php多進程的程序,其實就像把大象放在冰箱裡有幾步一樣簡單。
php實作多進程簡單來說就三步驟:建立子進程,管理子進程,處理子進程。 說起來簡單,其中涉及到的知識卻是不少,比如說你得知道每個進程都有一個進程號(pid),還得知道命令列是如何執行php檔案之類的。 (推薦學習:PHP影片教學)
php多重過程需要pcntl,posix擴充支持,可以透過 php -m 查看。
第一步的建立子進程,用到的是pcntl_fork()函數,函數傳回值通常為0,失敗時傳回-1。我先舉一個創建子進程的直覺小栗子:
$ppid = posix_getpid(); $pid = pcntl_fork(); if ($pid == -1) { throw new Exception('fork子进程失败!'); } elseif ($pid > 0) { cli_set_process_title("我是父进程,我的进程id是{$ppid}."); sleep(30); // 保持30秒,确保能被ps查到 } else { $cpid = posix_getpid(); cli_set_process_title("我是{$ppid}的子进程,我的进程id是{$cpid}."); sleep(30); }
第二步驟的管理子進程,使用的是訊號。簡單來說,就是父行程裡使用兩個函式pcntl_signal()和pcntl_signal_dispatch,負責為子行程安裝訊號處理器和分發工作。 這個步驟就先如此簡單介紹一下,因為牽涉到一個回呼函數的概念,以後我會補上更全面地內容。
第三步驟的處理子進程,也是需要兩個函數。一個是發送終止訊號的posix_kill()函數,一個是等待子程序狀態的pcntl_waitpid()函數,這樣就可以實現跟子程序共同完成的任務的目的了。
所以,後端開發就是這樣,很多以為會複雜的東西,其實步驟很清晰,基本上都屬於用到的知識多,用到的函數卻不多這樣。所以入門的時候就硬著頭皮學下去好了,要相信自己總有一天可以很清楚明白。
以上是php是單一進程還是多進程的詳細內容。更多資訊請關注PHP中文網其他相關文章!