一些耗時任務:
大資料表分表後的統計資訊功能
分批傳送簡訊或郵件功能
其他可分目標的任務功能(很多種)
所以我們就需要乙個常駐記憶體的任務管理工具,為了保證實時性,一方面我們讓它一直執行任務(適當的睡眠,保證cpu不被100%占用),另一方面我們實現多程序保證併發的執行任務,當然除此之外也可按情況使用執行緒、協程實現。
實現php程序前,需了解常見的php的執行模式:
cgi通用閘道器介面模式
fast-cgi模式
cli命令列模式 (php ***.php)
模組模式(作為伺服器模組)
而php程序則是使用cli命令列模式執行的
php中提供了乙個擴充套件pcntl,可以利用作業系統的fork呼叫來實現多程序。fork呼叫後執行的**將是並行的,且只能在linux下執行。
$ppid = posix_getpid();// 獲取當前程序pid
$pid = pcntl_fork(); //建立程序
switch ($pid)的子程序,我的程序id是.");
sleep(30);
exit; // 這裡exit掉,避免worker繼續執行下面的**而造成一些問題
break;
// 主程序master
default:
cli_set_process_title("我是父程序,我的程序id是.");
pcntl_wait($status); // 掛起父程序,等待並返回子程序狀態,防止子程序成為殭屍程序
break;
}
在命令列php ***.php執行後,使用ps aux | grep 程序可以看到:
如果沒看到,可能是中文亂碼了,使用ps aux,檢視
或者使用ps –ajft檢視層次顯示
建立好了程序,那麼怎麼對子程序進行管理呢?使用訊號,對子程序的管理,一般有兩種情況:
posix_kill():此函式並不能顧名思義,它通過向子程序傳送乙個訊號來操作子程序,在需要要時可以選擇給子程序傳送程序終止訊號來終止子程序;
pcntl_waitpid():等待或返回fork的子程序狀態,如果指定的子程序在此函式呼叫時已經退出(俗稱殭屍程序),此函式將立刻返回,並釋放子程序的所有系統資源,此程序可以避免子程序變成殭屍程序,造成系統資源浪費;
孤兒程序:父程序掛了,子程序被pid=1的init程序接管(wait/waitpid),直到子程序自身生命週期結束被系統**資源和父程序 採取相關的**操作
殭屍程序:子程序exit退出,父程序沒有通過wait/waitpid獲取子程序狀態,子程序占用的程序號等描述資源符還存在,產生危害:例如程序號是有限的,無法釋放程序號導致未來可能無程序號可用
**父程序中使用:pcntl_wait或者pcntl_waitpid的目的就是防止worker成為殭屍程序
作用:使用pcntl_wait()後,在子程序死掉後,父程序也會被停止**
最後我們通過下圖(1-1)來簡單的總結和描述這個多程序實現的過程:
使用&實現
php deadloop.php &
乙個耗時10s的任務,執行2次,總耗時20s,而開2個程序,只需10s,如下:
index.php(程序開啟指令碼):$cmds = [
['./job.php', 0, 50000],//執行指令碼,並傳參
['./job.php', 50000, 100000]
];for ($i = 0; $i < 2; $i++)的子程序,我的程序id是.");
// 執行業務指令碼
pcntl_exec('/usr/local/php/bin/php', $cmds[$i]);
exit; // 這裡exit掉,避免worker繼續執行下面的**而造成一些問題
break;
}}// 等待子程序結束
while (pcntl_waitpid(0, $status) != -1)
執行php index.php後:
例項達到理想效果。
程序的管理(五) 程序的實現
為了實現程序模型,作業系統維護著一張 也就是程序表 process table 每乙個程序占用乙個程序表項 pcb 每個表項包含了許多的重要項,包括程式計數器 堆疊指標 記憶體分配的情況 所開啟的檔案狀態 賬號和排程資訊 以及其他程序由執行態轉換到就緒態或者阻塞狀態必須要儲存的資訊,從而保證該程序隨...
程序的管理(五) 程序的實現
為了實現程序模型,作業系統維護著一張 也就是程序表 process table 每乙個程序占用乙個程序表項 pcb 每個表項包含了許多的重要項,包括程式計數器 堆疊指標 記憶體分配的情況 所開啟的檔案狀態 賬號和排程資訊 以及其他程序由執行態轉換到就緒態或者阻塞狀態必須要儲存的資訊,從而保證該程序隨...
php 守護程序的實現
1 php沒有執行在安全模式,關掉安全模式,即 safe mode off 2 禁用函式列表 disable functions exec,system,shell exec,proc open,popen,一般來說,exec 這些函式為了安全,都會禁用,在php.ini裡面把這些禁用的函式放出來。...