PHP中提供了一個擴展pcntl,可以利用操作系統的fork調用來實現多進程。fork調用后執行的代碼將是並行的。
PHP官方沒有提供多線程的擴展,pecl中有一個pthreads擴展提供了多線程的特性,地址是http://pecl.php.net/package/pthreads,此擴展僅在線程安全版本中可用。
多進程
- 使用多進程, 子進程結束以后, 內核會負責回收資源
- 使用多進程, 子進程異常退出不會導致整個進程Thread退出. 父進程還有機會重建流程.
- 一個常駐主進程, 只負責任務分發, 邏輯更清楚.
- 多進程方式更加穩定,另外利用進程間通信(IPC)也可以實現數據共享。
- 共享內存,這種方式和線程間讀寫變量是一樣的,需要加鎖,會有同步、死鎖問題。
- 消息隊列,可以采用多個子進程搶隊列模式,性能很好
多線程
- 線程是在同一個進程內的,可以共享內存變量實現線程間通信
- 線程比進程更輕量級,開很大量進程會比線程消耗更多系統資源
多線程也存在一些問題:
- 線程讀寫變量存在同步問題,需要加鎖
- 鎖的粒度過大存在性能問題,可能會導致只有1個線程在運行,其他線程都在等待鎖
- 同時使用多個鎖,邏輯復雜,一旦某個鎖沒被正確釋放,可能會發生線程死鎖
- 某個線程發生致命錯誤會導致整個進程崩潰
php搭建pcntl
在PHP中進程控制支持默認是關閉的。您需要使用 –enable-pcntl 配置選項重新編譯PHP來打開進程控制支持。注:pcntl只支持Linux版本
##本例用的php版本的是5.3.3,
cd php-5.3.3/ext/pcntl
phpize
./configure --with-php-config=/usr/local/bin/php-config
make
make isntall
在php.ini下加入pcntl.so
即可
extension=pcntl.so
代碼演示
現在我們通過 pcntl擴展來調用操作系統的fork實現多進程。fork調用后執行的代碼將是並行的。
<?php
$pid = pcntl_fork();
if($pid > 0){
echo "parent\n";
}elseif($pid == 0){
echo "child\n";
}else{
echo "error\n";
}
參考地址:
http://php.net/manual/zh/book.pcntl.php
http://www.laruence.com/2009/06/11/930.html