如題,能否給出詳細的理由,謝過。
回複內容:
如題,能否給出詳細的理由,謝過。
平時說的並發多數是針對服務的,比如說 apache nginx
而不是說php
再加上 php是有多線程擴充的 只是平時項目中沒有用到而已
定義多線程類 extends Thread
其實這句話本身是歧義的。
首先看前提條件:
php不支援多線程
PHP 語言代碼本身(大部分情況下)是不關心自身是多進程還是多線程的。但,這並不表示 PHP 不支援多線程/多進程。php-fpm 就是多進程單線程的,apeche 的多線程模式就是多線程的。PHP 只是一般不會在 PHP 代碼層級直接控制進程或者線程。
不用考慮並發問題
前提不成立,結論也就沒有什麼因果關係了。
我理解說這句話的人的本意是:因為 PHP 一般不支援控制進程、線程,所以也不會從直接通過代碼控制進程、線程來應對並發問題。
這麼說是沒什麼問題的。
但是,並發問題還依舊是並發問題,不會因為 PHP 代碼本身不太支援解決並發問題,並發問題就不存在的。
解決 PHP 的並發問題常規方式是通過各種配置的調整(nginx.conf, php-fpm.ini, php.ini)、然後就是負載平衡之類的方式來解決的。這些不是 PHP 代碼,但是是與 PHP 相關密切的東西,作為 PHPer 也是需要掌握的。
另外,針對具體的業務類型修改 PHP 邏輯,甚至前端調用邏輯也是有的。還有包括 swoole 之類徹底拋棄 php-fpm 的擴充方式,將 PHP 從基礎上支援非同步並發(然而還是單線程)。這些並發最佳化方式就要針對具體業務來選擇了。
錯,牛頭不對馬嘴!
PHP是不支援多線程,但是命令列程式的後台運行或web應用程式的php-fpm都可以是多進程並發處理的,所以避免不了產生並發問題,比如一個訂單就1個庫存,兩個並發請求同時上來你如何保證訂單不超賣?
就算不考慮多線程 並發依然存在 並且更為難解決 還是要想辦法去避免和最佳化的
並發只有多線程?這也太狹隘了
PHP本來就支援多線程呀,所以才有安全執行緒和非安全執行緒的區別.
PHP的多線程擴充請看:
https://pecl.php.net/package/pthreads
這個擴充提供了實實在在的PHP多線程編程支援,一般用於cli下的指令碼編程.
另外國人峰哥還開發了一個提供了非同步多線程架構支援用PHP開發高效能即時網路服務的擴充Swoole:
https://pecl.php.net/package/swoole
Swoole裡的多線程並不需要編程者關心,它更像一套架構,你只需配置,Swoole一般也是用於cli下的指令碼編程.
像經常跟Nginx配合使用的PHP FastCGI服務PHP-FPM是使用多進程實現利用多核應對並發,跟採用prefork MPM的Apache類似.PHP-FPM支援進程池設定,支援靜態和動態進程數量設定,支援天然的透明的"資料庫連接池"(持久串連):
MOD_PHP搭配採用event MPM的Apache跑的時候也是工作於多線程狀態,因為Apache event MPM是一個多進程多線程事件驅動的MPM,這是PHP需要使用安全執行緒版本.