PHP多線程編程的實現以及非阻塞的實現。php預設並不支援多線程,要使用多線程需要安裝 pthread 擴充,在安裝好後,就可以進行多線程編程。
線程概念
線程是作業系統能夠進行調度的最小單位
一個多線程程式比單線程程式被作業系統調度的機率更大,所以多線程程式一般會比單線程程式更高效;
多線程程式的多個線程可以在多核 CPU 的多個核心同時運行,可以將完全發揮機器多核的優勢;
線程的建立和切換的系統開銷都比進程要小,所以一定程度上會比多進程更高效;
線程天生的共用記憶體空間,線程間的通訊更簡單,避免了進程IPC引入新的複雜度。
什麼時候該使用線程
I/O 阻塞會使作業系統發生任務調度,阻塞當前任務,所以代碼中 I/O 多的情況下,使用多線程時可以將代碼並行
多線程能充分利用 CPU,所以有多處大計算量代碼時,也可以使用多線程使他們並存執行
用線程的好與壞
PHP 實現的安全執行緒主要是使用 TSRM 機制對 全域變數和靜態變數進行了隔離,將全域變數和靜態變數 給每個線程都複製了一份,各線程使用的都是主線程的一個備份,從而避免了變數衝突,也就不會出現安全執行緒問題。
子線程一旦開始運行,主線程便無法再對子線程運行細節進行調整
擴充安裝
PHP 預設並不支援多線程,要使用多線程需要安裝 pthread 擴充,而要安裝 pthread 擴充,必須使用 --enable-maintainer-zts 參數重新編譯 PHP,這個參數是指定編譯 PHP 時使用安全執行緒方式。
./configure --enable-maintainer-zts --with-tsrm-pthreads
執行個體
class Request extends Thread { public $url; public $response; public function __construct($url) { $this->url = $url; } public function run() { $this->response = file_get_contents($this->url); }}$chG = new Request("www.google.com");$chB = new Request("www.baidu.com");$chG ->start();$chB ->start();$chG->join();$chB->join();$gl = $chG->response;$bd = $chB->response;
PHP非阻塞
使用 fastcgi_finish_request()
echo "program start...";fastcgi_finish_request();sleep(1);echo 'debug1...';sleep(10);echo 'debug2...';
使用 fsockopen()
stream_set_blocking()
使用 cURL
$cmh = curl_multi_init();
使用 Gearman/Swoole 擴充
使用緩衝和隊列
redis
調用系統命令
$cmd = 'nohup php ./processd.php $someVar >/dev/null &';
使用 pcntl_fork()
PHP 原生支援
yield