摘要:運行模式實現(xiàn)進程前,需了解常見的的運行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進程則是使用命令行模式運行的基本實現(xiàn)中提供了一個擴展,可以利用操作系統(tǒng)的調(diào)用來實現(xiàn)多進程。
應(yīng)用場景
一些耗時任務(wù):
大數(shù)據(jù)表分表后的統(tǒng)計信息功能
分批發(fā)送短信或郵件功能
其他可分目標的任務(wù)功能(很多種)
所以我們就需要一個常駐內(nèi)存的任務(wù)管理工具,為了保證實時性,一方面我們讓它一直執(zhí)行任務(wù)(適當?shù)乃?,保證cpu不被100%占用),另一方面我們實現(xiàn)多進程保證并發(fā)的執(zhí)行任務(wù),當然除此之外也可按情況使用線程、協(xié)程實現(xiàn)。
運行模式實現(xiàn)PHP進程前,需了解常見的php的運行模式:
CGI通用網(wǎng)關(guān)接口模式
FAST-CGI模式
CLI命令行模式 (php xxx.php)
模塊模式(作為服務(wù)器模塊)
而php進程則是使用CLI命令行模式運行的
基本實現(xiàn)PHP中提供了一個擴展pcntl,可以利用操作系統(tǒng)的fork調(diào)用來實現(xiàn)多進程。fork調(diào)用后執(zhí)行的代碼將是并行的,且只能在linux下運行。
$ppid = posix_getpid();// 獲取當前進程PID $pid = pcntl_fork(); //創(chuàng)建進程 switch ($pid){ // 創(chuàng)建進程錯誤 case -1: throw new Exception("fork子進程失敗!"); break; // 子進程worker case 0: $cpid = posix_getpid(); cli_set_process_title("我是{$ppid}的子進程,我的進程id是{$cpid}."); sleep(30); exit; // 這里exit掉,避免worker繼續(xù)執(zhí)行下面的代碼而造成一些問題 break; // 主進程master default: cli_set_process_title("我是父進程,我的進程id是{$ppid}."); pcntl_wait($status); // 掛起父進程,等待并返回子進程狀態(tài),防止子進程成為僵尸進程 break; }
在命令行php xxx.php運行后,使用ps aux | grep 進程可以看到:
如果沒看到,可能是中文亂碼了,使用ps aux,查看
或者使用ps –ajft查看層次顯示
進程管理-防止進程成為僵尸進程創(chuàng)建好了進程,那么怎么對子進程進行管理呢?使用信號,對子進程的管理,一般有兩種情況:
posix_kill():此函數(shù)并不能顧名思義,它通過向子進程發(fā)送一個信號來操作子進程,在需要要時可以選擇給子進程發(fā)送進程終止信號來終止子進程;
pcntl_waitpid():等待或返回fork的子進程狀態(tài),如果指定的子進程在此函數(shù)調(diào)用時已經(jīng)退出(俗稱僵尸進程),此函數(shù)將立刻返回,并釋放子進程的所有系統(tǒng)資源,此進程可以避免子進程變成僵尸進程,造成系統(tǒng)資源浪費;
孤兒進程:父進程掛了,子進程被pid=1的init進程接管(wait/waitpid),直到子進程自身生命周期結(jié)束被系統(tǒng)回收資源和父進程 采取相關(guān)的回收操作
僵尸進程:子進程exit退出,父進程沒有通過wait/waitpid獲取子進程狀態(tài),子進程占用的進程號等描述資源符還存在,產(chǎn)生危害:例如進程號是有限的,無法釋放進程號導致未來可能無進程號可用
**父進程中使用:pcntl_wait或者pcntl_waitpid的目的就是防止worker成為僵尸進程
作用:使用pcntl_wait()后,在子進程死掉后,父進程也會被停止**
最后我們通過下圖(1-1)來簡單的總結(jié)和描述這個多進程實現(xiàn)的過程:
進程管理-進程間通信隊列:如Redis,推薦
socket:推薦
管道:實現(xiàn)復雜,且管道(pipe),使用文件形式存在,存在硬盤IO性能瓶頸
信號:承載信息量少,不好管理
使用&實現(xiàn)
php deadloop.php &
一個耗時10S的任務(wù),執(zhí)行2次,總耗時20S,而開2個進程,只需10S,如下:
job.php:
index.php(進程開啟腳本):
echo "開始時間:".date("H:i:s", time())." "; $cmds = [ ["./job.php", 0, 50000],//執(zhí)行腳本,并傳參 ["./job.php", 50000, 100000] ]; for ($i = 0; $i < 2; $i++){ $ppid = posix_getpid();// 獲取當前進程PID $pid = pcntl_fork(); //創(chuàng)建進程 switch ($pid){ // 創(chuàng)建進程錯誤 case -1: throw new Exception("fork子進程失敗!"); break; // 子進程worker case 0: $cpid = posix_getpid(); cli_set_process_title("我是{$ppid}的子進程,我的進程id是{$cpid}."); // 執(zhí)行業(yè)務(wù)腳本 pcntl_exec("/usr/local/php/bin/php", $cmds[$i]); exit; // 這里exit掉,避免worker繼續(xù)執(zhí)行下面的代碼而造成一些問題 break; } } // 等待子進程結(jié)束 while (pcntl_waitpid(0, $status) != -1) { $status = pcntl_wexitstatus($status); echo "子進程結(jié)束時間:".date("H:i:s", time())." "; }
運行php index.php后:
實例達到理想效果。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/39930.html
摘要:運行模式實現(xiàn)進程前,需了解常見的的運行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進程則是使用命令行模式運行的基本實現(xiàn)中提供了一個擴展,可以利用操作系統(tǒng)的調(diào)用來實現(xiàn)多進程。 應(yīng)用場景 一些耗時任務(wù): 大數(shù)據(jù)表分表后的統(tǒng)計信息功能 分批發(fā)送短信或郵件功能 其他可分目標的任務(wù)功能(很多種) 所以我們就需要一個常駐內(nèi)存的任務(wù)管理工具,為了保證實時性,一方面我們讓它一直執(zhí)行任...
摘要:當客戶端請求到達時,進程管理器選擇并連接到一個解釋器。子進程完成處理后將標準輸出和錯誤信息從同一連接返回。子進程接著等待并處理來自進程管理器運行在中的下一個連接。 目前常見的4種PHP運行模式 CGI通用網(wǎng)關(guān)接口模式 FAST-CGI模式 CLI命令行模式 模塊模式 運行模式 CGI通用網(wǎng)關(guān)接口模式 每有一個用戶請求,都會先要創(chuàng)建cgi的子進程,然后處理請求,處理完后結(jié)束這個子進程...
摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當收到這個請求后,會啟動對應(yīng)的程序,這里就是的解析器。接下來解析器會解析文件,初始化執(zhí)行環(huán)境,然后處理請求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...
摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當收到這個請求后,會啟動對應(yīng)的程序,這里就是的解析器。接下來解析器會解析文件,初始化執(zhí)行環(huán)境,然后處理請求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...
閱讀 1650·2021-09-26 09:55
閱讀 1383·2021-09-23 11:22
閱讀 2742·2021-09-06 15:02
閱讀 2651·2021-09-01 11:43
閱讀 3973·2021-08-27 13:10
閱讀 3688·2021-08-12 13:24
閱讀 2079·2019-08-30 12:56
閱讀 3005·2019-08-30 11:22