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
相關推薦:
#php安裝threads多執行緒擴展,phpthreads多執行緒
#以上是PHP實作非阻塞以及多執行緒編程的詳細內容。更多資訊請關注PHP中文網其他相關文章!