線程概念
線程是操作系統能夠進行調度的最小單位
一個多線程程序比單線程程序被操作系統調度的概率更大,所以多線程程序一般會比單線程程序更高效;
多線程程序的多個線程可以在多核 CPU 的多個核心同時運行,可以將完全發揮機器多核的優勢;
線程的創建和切換的系統開銷都比進程要小,所以一定程度上會比多進程更高效;
線程天生的共享內存空間,線程間的通信更簡單,避免了進程IPC引入新的復雜度。
什么時候該使用線程
I/O 阻塞會使操作系統發生任務調度,阻塞當前任務,所以代碼中 I/O 多的情況下,使用多線程時可以將代碼并行
多線程能充分利用 CPU,所以有多處大計算量代碼時,也可以使用多線程使他們并行執行
用線程的好與壞
PHP 實現的線程安全主要是使用 TSRM 機制對 html' target='_blank'>全局變量和靜態變量進行了隔離,將全局變量和靜態變量 給每個線程都復制了一份,各線程使用的都是主線程的一個備份,從而避免了變量沖突,也就不會出現線程安全問題。
子線程一旦開始運行,主線程便無法再對子線程運行細節進行調整
擴展安裝
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教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答