PHP從設計之初到流行起來都沒有出現明顯需要用多執行緒才能解決的需求。
某些需要用到多執行緒的地方也有對應的解決方案和替代方案。多執行緒並不總是比單執行緒優,多執行緒可能會引入其他問題(例如:兩個執行緒同時呼叫一個類別裡的同一個方法時,可能出現死鎖的情況)。 (推薦學習:PHP程式設計從入門到精通)
你可以這樣理解對應一個客戶的一個頁面請求處理的php 是單執行緒處理的, 這樣一來就可以自上而下的去編輯/理解程式碼中的業務邏輯了, 但是php 可以同時開很多線程來處理很多用戶請求的同一個PHP , 所以php 也可以看成是"多線程"的。
每個PHP檔案的執行是單執行緒的,但是,伺服器(apache/nigix/php-fpm)是多執行緒的。每次對某個PHP檔案的存取伺服器都會建立一個新的進程/線程,用來執行對應的PHP檔案。
也就是說對於一個請求來說PHP是單執行緒的,但是多個請求間是並發的。
其實一般寫 PHP 程式認為是單執行緒的就可以了。多個請求之間相互的關係就是,有些時候讀寫資料庫,文件,session等會加鎖,會導致後面的請求掛起等待前面的請求執行完才繼續。
至於協程,只能說是一種新的程式執行流程(舊的是順序,判斷,循環),本質是也是單執行緒的
#所以準確的說php是單線程的,一定程度上也可以看成是「多線程」! ! !
PHP多線程
在預設情況下PHP是不支援多線程的,要使用多線程需要安裝擴展,目前常用的擴展有pcnlt ,POSIX ,pthreads,但是用的最多的還是pthreads擴展,它通過使用參數來指定來編譯PHP時的線程安全方式,使其支持多線程
在使用線程之前首先要考慮到線程的安全性問題,執行緒安全指的是某個函數或函數庫在多執行緒環境中被呼叫時,能夠正確的處理多執行緒之間的共享變量,使得程式的功能能夠正確完成
#PHP實作執行緒安全性
PHP實作執行緒安全性主要透過TSRM 機制,透過此機制可以對全域變數和靜態變數進行隔離,並且給每個執行緒複製了一份全域變數和靜態變數。各個執行緒使用的都是主執行緒的一個備份。這樣就避免了變數衝突,也不會發生線程安全的問題。
PHP 對多執行緒的封裝保證了執行緒安全,所以開發人員就不需要在考慮讀寫衝突的問題了,也使得程式碼更加安全。不過這樣做也有不好的地方,例如當子執行緒開始運作時,主執行緒便再也無法對子執行緒運行細節進行調整了,失去了訊息傳遞能力
以上是php是多線程還是單線程的詳細內容。更多資訊請關注PHP中文網其他相關文章!