PHP在Web服務上的探索

傳統模式

cgi

早期的web程序其實都是一種cgi程序,cgi是什麼?cgi程序又是什麼?通用網關接口(Common Gateway Interface/CGI)是一種互聯網技術,可以讓一個客戶端向服務器上的程序請求數據。CGI描述了服務器(nginx\apache)和請求處理程序(php)之間傳輸數據的一種標準。這是一種標準、協議,不是程序。cgi程序是實現了cgi標準的程序。

fastcgi

cgi協議是這樣的處理機制:請求來一個,便建起一個進程,這樣的程序很容易實現,但是不好擴展,當併發量大了後,可能會有成千上萬的進程,操作系統面對如此大的進程數,增加了進程上下文切換、新建以及銷燬進程的開銷,cpu資源佔據居高不下,拖慢系統。內存上,由於進程處理完請求便銷燬,地址空間無法共享與重用。

現在的php-fpm採用的是fastcgi協議,與cgi不同,fastcgi使用持續的進程(1 master,n workers)來處理一連串的請求。這些進程由fastcgi服務器(php-fpm)管理,而不是web服務器。 當進來一個請求時,web服務器把環境變量和這個頁面請求通過一個socket比如fastcgi進程與web服務器(都位於本地)或者一個TCP connection(fastcgi進程在遠端的server farm)傳遞給fastcgi進程。

黃金搭檔

LAMP

php在apache中是以mod_php擴展的形式存在,必須依靠apache才能啓動,當請求到達,apache判斷是否是php程序,提交給php解釋器進行處理,處理完並返回。

LNMP

nginx可以配置資源類型,當請求到達時,比如/index.html,這是靜態資源,服務器會到配置的web root文件系統中尋找,然後返回這個文件。如果請求的是/index.php,nginx知道必須把這個交給php解釋器,這時候,根據cgi規範,把該有的數據(查詢字符串、post數據,http header等等)發到相應的fastcgi進程進行處理。

LANMP

LANMP使用nginx作爲前端和代理服務器,利用nginx應對高併發的能力,真正的服務器可能有多個,比如apache。nginx把請求反向代理給後端的服務器。

Swoole常駐內存模式

php在這之前都是屬於cgi程序,依賴於php-fpm。php-fpm是同步阻塞模式,雖然進程複用,但是PHP是短生命週期的,一次請求結束,php的變量和對象就會銷燬。相較之下,swoole應運而生了。swoole的http server是常駐內存的,而且worker爲異步非阻塞,可以處理更大的請求數。

swoole機制

swoole的reacter線程就好像nginx,異步非阻塞(epoll)的處理網絡請求、協議,緩衝數據frame並拆分。然後把數據包通過unixsocket發送到worker(好像fpm的worker)進行處理。有時候我們需要處理一些IO耗時任務,可以通過投遞task進程進行處理,比如消息隊列,連接池。

nginx和swoole

一個很好的思路是,仍然使用nginx作爲前端服務器,然後把請求反向代理到swoole服務器。

root /data/code/app/static;
location / {
	proxy_http_version 1.1;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_pass http://127.0.0.1:9501;
}

協程

  • 協作式
  • 搶佔式任務

進程和線程都是搶佔式的,由操作系統調度上下文切換,保存上下文狀態。

協程更像是編譯器的魔法,通過一些代碼使得進程中的代碼段能夠分段執行,每次調度都會從yield開始。

協程是用戶態線程,理論上可以建起成百上千萬個協程。相較於進程和線程,無需從用戶態過渡到內核態,創建和切換的開銷更低。

php yield

在之前的文章中,我粗略的介紹了yield的使用,yield的語義有生成器的意思,生成器的意思是,從一端把數據傳到另一端。而協程的實現正是yield的雙向通信。

swoole coroutine

swoole2.x已經完全在底層實現了協程調度,開發者在業務層無需再通過yield的關鍵字來顯式執行調用,只需要以同步的方式編寫代碼,底層自動切換。

swoft微服務

很多人由於PHP沒有成熟的微服務框架而轉到JAVA或者Go或者其他成熟的語言,swoole社區有一些人(swoft)把大家熟知的JAVA編程思想搬了過來,基於swoole2.x,全協程,AOP面向切面編程、服務治理,熔斷、降級、負載、註冊與發現,基於註解編程,看起來和JAVA非常像,通過composer把一切組件化。不過,1.0剛剛發佈,需要開源社區的支持。看起來非常有前景。

後記

最近利用業餘時間基於swoole,做了兩個有趣的項目,歡迎star:)

  1. 基於swoole websocket的聊天室
  2. 基於swoole http server的小程序遊戲後端服務
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章