首頁  >  文章  >  後端開發  >  PHP實作非阻塞以及多執行緒編程

PHP實作非阻塞以及多執行緒編程

不言
不言原創
2018-07-20 17:09:582342瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn