linux
腳本後臺化方式
- php task.php &
- nohup php task.php &
- fork 和 setsid *nix解決方案
php多線程與進程
1.使用線程安全版本ZTS
2. 安裝pecl的 【pthread擴展】
php多進程需要在安裝PHP的時候開啓pcntl, 不要在apache或者fpm環境下使用php多進程
php多進程pcntl_fork()來創建多進程
1.子進程與父進程共享程序正文段
2.子進程擁有父進程的數據空間和堆,棧的副本(COW寫時複製)
3.父進程和子進程將繼續執行fork之後的程序代碼((包含pcntl_fork函數)
4.fork之後,父進程與子進程的執行順序無法確認,取決於系統調度
pcntl_fork函數
在父進程中返回子進程的進程ID,在子進程內部返回數字0
代碼
pcntl_fork()
配合for
循環來做些東西 會顯示幾次"sun"代碼?
<?php
for( $i = 1; $i <= 3 ; $i++ ){
$pid = pcntl_fork();
if( $pid > 0 ){
// do nothing ...
} else if( 0 == $pid ){
echo "sun".PHP_EOL;
}
}
- 產生7次而不是3次,但下面會是三次
<?php
for( $i = 1; $i <= 3 ; $i++ ){
$pid = pcntl_fork();
if( $pid > 0 ){
// do nothing ...
} else if( 0 == $pid ){
echo "sun".PHP_EOL;
exit();
}
}
分析
- i=1的時候父進程的pid不爲0 這時候fork了一個pid=0的子進程a, 子進程數量1
- i=2的時候父進程fork了一個子進程b, 子進程a又fork了一個子進程c, 子進程數量1+2
- i=3的時候父進程fork了一個子進程d, a子進程fork了e, b子進程fork了f, c子進程fork了g子進程數量1+2+4=7
- 至於在fork子進程退出的時候 i=1 =2 =3的時候都只有一個父進程fork一個子進程 所以只有三個兒子
父子進程小結
- 父生子,子又生子,子子孫孫無窮盡也
exit
會讓當前進程斷子絕孫- 多進程執行時,程序正文檔是大家的,什麼時候執行哪一段,不確定,由系統調度說了算