使用yaf框架,每每安裝後啓動php/hhvm + 啓動nginx/Lighttpd,接着就是分層開發了,那幾者的關係是什麼呢?php
作個筆記, 感謝 http://www.javashuo.com/article/p-bymfggqb-br.htmlhtml
nginx:webserver,用於接受請求,分發,中文官網:http://www.nginx.cn/doc/index.htmlnginx
php-fpm (php fast-cgi process manager):某種實現了fast-cgi協議的進程管理器git
cgi: Common Gateway Interface 知足這種協議的程序便可實現和webserver的通訊,github
fast-cgi: 協議的升級版本web
基本版本是webserver每收到一個請求,都會去fork一個cgi進程,請求結束再kill掉這個進程。這樣有10000個請求,就須要fork、kill php-cgi進程10000次segmentfault
升級版本fast-cgi是每次處理完請求後,不會kill掉這個進程,而是保留這個進程,使這個進程能夠一次處理多個請求瀏覽器
php-fpm的具體實現是進程管理器包含 master 進程和 worker 進程兩種進程。master 進程只有一個,負責監聽端口,接收來自 Web Server 的請求,而 worker 進程則通常有多個(具體數量根據實際須要配置),每一個進程內部都嵌入了一個 PHP 解釋器,是 PHP 代碼真正執行的地方。網絡
UNIX Domain Socket:php-fpm.conf可配置listen爲sock文件,sock比端口號更快
socket API本來是爲網絡通信設計的,但後來在socket的框架上發展出一種IPC機制,就是UNIX Domain Socket。 雖然網絡socket也可用於同一臺主機的進程間通信(經過loopback地址127.0.0.1), 可是UNIX Domain Socket用於IPC更有效率:不須要通過網絡協議棧,不須要打包拆包、計算校驗和、維護序號和應答等,只是將應用層數據從一個進程拷貝到另外一個進程。 UNIX域套接字與TCP套接字相比較,在同一臺主機的傳輸速度前者是後者的兩倍。 這是由於,IPC機制本質上是可靠的通信,而網絡協議是爲不可靠的通信設計的。 UNIX Domain Socket也提供面向流和麪向數據包兩種API接口,相似於TCP和UDP,可是面向消息的UNIX Domain Socket也是可靠的,消息既不會丟失也不會順序錯亂。
https://jaminzhang.github.io/network/the-difference-between-unix-domain-socket-and-tcp-ip-socket/
https://lists.freebsd.org/pipermail/freebsd-performance/2005-February/001143.html
cgi 協議主要是規範了輸入和輸出形式框架
1. nginx.conf配置webserver參數, 請求PHP類應用可配置fastcgi_pass,指明監聽端口或socket地址
2. php-fpm.conf中listen地址與nginx.conf fastcgi_pass字段配置一致(sock文件或是端口),代表php-fpm worker進程監聽目標
3. 啓動後,請求先到達nginx server端口,分發到對應位置,若配置了fastcgi-pass,則被轉到對應端口或socket,php-fpm master進程監聽到,再建立fork worker進程實際運行,運行結束返回給nginx。
www.example.com
| | Nginx | | 路由到www.example.com/index.php | | 加載nginx的fast-cgi模塊 | | fast-cgi監聽127.0.0.1:9000地址 | | www.example.com/index.php請求到達127.0.0.1:9000 | | php-fpm 監聽127.0.0.1:9000 | | php-fpm 接收到請求,啓用worker進程處理請求 | | php-fpm 處理完請求,返回給nginx | | nginx將結果經過http返回給瀏覽器
由此再看yaf 框架,C實現,使用了webserver和php-fpm的話,實現了分層,按它的框架可快速實現請求處理(來源:http://www.laruence.com/manual/yaf.sequence.html)
幾點反思:
實際須要實現分發效果到話,搭建nginx便可,無需框架,理解框架的做用是根據模塊名分發URL
請求報錯,日誌顯示fast-cgi相關到話,可理解爲PHP解釋器與nginx通訊存在問題,check相關配置