php不支持多線程怎麼辦

 

PHP 默認並不支持多線程,要使用多線程須要安裝 pthread 擴展,而要安裝 pthread 擴展,必須使用 --enable-maintainer-zts 參數從新編譯 PHP,這個參數是指定編譯 PHP 時使用線程安全方式。php

線程安全程序員

多線程是讓程序變得不安分的一個因素,在使用多線程以前,首先要考慮線程安全問題:編程

線程安全:線程安全是編程中的術語,指某個函數、函數庫在多線程環境中被調用時,可以正確地處理多個線程之間的共享變量,使程序功能正確完成。數組

在傳統多線程中,因爲多個線程共享變量,因此可能會致使出現以下問題:安全

  1. 存在一個全局數組$arr = array('a');;
  2. A線程獲取數組長度爲1;
  3. B 線程獲取數組長度爲1;
  4. A 線程 pop 出數組元素 $a = array_pop($arr); $a = 'a';;
  5. B 線程也 pop 數組元素 $b = array_pop($arr); $a = null;;
  6. 此時 B 線程內就出現了靈異事件,明明數組長度大於0,或沒有 pop 出東西;

PHP 實現多線程

PHP 實現的線程安全主要是使用 TSRM 機制對 全局變量和靜態變量進行了隔離,將全局變量和靜態變量 給每一個線程都複製了一份,各線程使用的都是主線程的一個備份,從而避免了變量衝突,也就不會出現線程安全問題。異步

PHP 對多線程的封裝保證了線程安全,程序員不用考慮對全局變量加各類鎖來避免讀寫衝突了,同時也減小了出錯的機會,寫出的代碼更加安全。函數

但由此致使的是,子線程一旦開始運行,主線程便沒法再對子線程運行細節進行調整了,線程必定程度上失去了線程之間經過全局變量進行消息傳遞的能力。線程

同時 PHP 開啓線程安全選項後,使用 TSRM 機制分配和使用變量時也會有額外的損耗,因此在不須要多線程的 PHP 環境中,使用 PHP 的 ZTS (非線程安全) 版本就好。對象

類和方法

PHP 將線程 封裝成了 Thread 類,線程的建立經過實例化一個線程對象來實現,因爲類的封裝性,變量的使用只能經過構造函數傳入,而線程運算結果也須要經過類變量傳出。

下面介紹幾個經常使用的 Thread 類方法:

  • run():此方法是一個抽象方法,每一個線程都要實現此方法,線程開始運行後,此方法中的代碼會自動執行;
  • start():在主線程內調用此方法以開始運行一個線程;
  • join():各個線程相對於主線程都是異步執行,調用此方法會等待線程執行結束;
  • kill():強制線程結束;
  • isRunning():返回線程的運行狀態,線程正在執行run()方法的代碼時會返回 true;

由於線程安全的實現,PHP 的多線程開始運行後,沒法再經過共享內存空間通訊,線程也沒法經過線程間通訊複用,因此我認爲 PHP 的「線程池」並無什麼意義。擴展內自帶的Pool 類是一個對多線程分配管理的類,這裏也再也不多介紹了。 

更多請關注php交流羣:點擊加羣

相關文章
相關標籤/搜索