PHP系統編程--01.多進程與多線程


PHP中提供了一個擴展pcntl,可以利用操作系統的fork調用來實現多進程。fork調用后執行的代碼將是並行的。

PHP官方沒有提供多線程的擴展,pecl中有一個pthreads擴展提供了多線程的特性,地址是http://pecl.php.net/package/pthreads,此擴展僅在線程安全版本中可用。

多進程

  1. 使用多進程, 子進程結束以后, 內核會負責回收資源
  2. 使用多進程, 子進程異常退出不會導致整個進程Thread退出. 父進程還有機會重建流程.
  3. 一個常駐主進程, 只負責任務分發, 邏輯更清楚.
  4. 多進程方式更加穩定,另外利用進程間通信(IPC)也可以實現數據共享。
  5. 共享內存,這種方式和線程間讀寫變量是一樣的,需要加鎖,會有同步、死鎖問題。
  6. 消息隊列,可以采用多個子進程搶隊列模式,性能很好

多線程

  1. 線程是在同一個進程內的,可以共享內存變量實現線程間通信
  2. 線程比進程更輕量級,開很大量進程會比線程消耗更多系統資源
  3. 多線程也存在一些問題:

    • 線程讀寫變量存在同步問題,需要加鎖
    • 鎖的粒度過大存在性能問題,可能會導致只有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






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM