PHP系統程式設計--01.多程式與多執行緒

gb4215287發表於2017-09-30

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版本

  1. ##本例用的php版本的是5.3.3,
  2. cd php-5.3.3/ext/pcntl
  3. phpize
  4. ./configure --with-php-config=/usr/local/bin/php-config
  5. make
  6. make isntall

在php.ini下加入pcntl.so即可

extension=pcntl.so

程式碼演示

現在我們通過 pcntl擴充套件來呼叫作業系統的fork實現多程式。fork呼叫後執行的程式碼將是並行的。

  1. <?php
  2. $pid = pcntl_fork();
  3. if($pid > 0){
  4. echo "parent\n";
  5. }elseif($pid == 0){
  6. echo "child\n";
  7. }else{
  8. echo "error\n";
  9. }

參考地址:

http://php.net/manual/zh/book.pcntl.php

http://www.laruence.com/2009/06/11/930.html


來源:http://www.cnblogs.com/linzhenjie/p/5485419.html

相關文章