從web伺服器談談php效能的提公升

2021-10-08 13:27:21 字數 1257 閱讀 8938

這裡不是說php語言從5.x版本到7.x版本達到的速度的巨大提公升。而是想說下從web請求的構架上,有哪些改變。

隨著傳統的靜態頁面開發,到動態互動**,web伺服器需要擴充套件php或者python的服務,來處理業務邏輯和連線資料庫。這個時候cgi應運而生。

1.cgi和fastcgi

cgi在通訊中起到了乙個翻譯的作用,把nginx獲取的網路請求翻譯給php,再把php的執行結果翻譯給nginx。舉個所有phper都熟悉的東西,$_server全域性變數,就是從cgi讀取來的。

每當客戶請求cgi的時候,web伺服器就請求作業系統生成乙個新的cgi直譯器程序,cgi的乙個程序則處理完乙個請求後退出,下乙個請求來時再建立新程序。當然,這樣在訪問量很少沒有併發的情況也行。可是當訪問量增大,併發存在,這種方式就不適合了。於是就有了fastcgi。除了要不斷的建立和銷毀,每次建立都要重新讀取php.ini和一些

fastcgi是cgi的管理器,在啟動nginx的時候,fastcgi程序管理器自身初始化,啟動多個cgi直譯器程序並等待來自web伺服器的連線;當客戶端請求到達web伺服器時,fastcgi程序管理器選擇並連線到乙個cgi直譯器。web伺服器將cgi環境變數和標準輸入傳送到fastcgi子程序中。fastcgi子程序完成處理後將標準輸出和錯誤資訊從同一連線返回web伺服器。當fastcgi子程序關閉連線時,請求便告處理完成。fastcgi子程序接著等待並處理來自fastcgi程序管理器的下乙個連線。因為減少了建立和銷毀,所以速度有了進一步提公升。

2.php-fpm

php-fpm就是給php用的優化版本的fastcgi,nginx接收到請求以後,會把訊息推給fastcgi所在的埠,因為nginx本身就是做反向**的。php-fpm用master程序監聽埠,用work程序來接收請求。

3.opcode和opcache

php是解釋型語言,所以每次執行都要編譯。一般情況線上**是不會改變的,所以,有了opcache,通過將 php 指令碼預編譯的位元組碼儲存到共享記憶體中來提公升 php 的效能, 儲存預編譯位元組碼的好處就是 省去了每次載入和解析 php 指令碼的開銷。這也大大提公升了php的速度。

4.swoole

隨著業務的增大,即使是編譯過**也是龐大的,每次都要載入也很慢,swoole解決了這個問題。讓 php 的**載入到記憶體後,擁有更長的生命週期,這樣建立的資料庫連線和其他大的物件,不被釋放。每次請求只需要處理很少的**,而這些**只在第一次執行時,被 php 解析器編譯,駐留記憶體。另外,之前 php 不能實現的,物件持久化、資料庫連線池,快取連線池都可以實現。系統的執行效率會大大提高。他做微服務是把好手。

php 內建Web伺服器

至php5.4.0起,php又多了乙個隱藏功能 內建web伺服器,不過內建伺服器不應該出現在生產環境中,但對本地開發卻是乙個很好的工具。所以我們無需安裝mamp,lamp或大型web伺服器,就能在本地編寫或預覽html。伺服器啟動 內建web伺服器啟動十分容易,只需要在當前專案根目錄開啟終端應用,輸...

Web伺服器效能改進小結

摘要 早些年從程式設計師開始,就接觸的是web開發,對於web伺服器有著深厚的感情。但一些年後,不再寫程式的我,開始玩玩架構,可是發現架構出來的產品對web伺服器效能有著貪婪的需求,好比計算機對記憶體永遠不滿足一樣。總希望web伺服器是乙個超級無比強大的巨人,可是這種希望就是一種貪婪,所以整理一下,...

專案 高效能web伺服器

reacotr模式本質上來講,他要求主線程 i o處理單元 只負責監聽檔案描述符上是否有事件發生,有的話就立即將該事件通知工作執行緒 邏輯單元 除此之外,主線城不做任何其他實質性的工作。讀寫資料,接受新的連線,以及處理客戶請求均在工作執行緒中完成。使用同步i o模型 epoll wait為例 實現的...