workerman / 小談PHP中的幾種執行模式

阿北哥ya發表於2018-04-06

我們知道 workerman 程式需要在php-cli模式下執行,也就是命令列模式,這塊我們有必要了解一下。

話說PHP當下一共有4種執行模式,分別是CGI、FastCGI、CLI和Web模組模式。

CGI

全稱是“通用閘道器介面”(Common Gateway Interface), 它可以讓一個客戶端,從網頁瀏覽器向執行在Web伺服器上的程式請求資料,描述的是客戶端和這個程式之間傳輸資料的一種標準,另外CGI獨立於任何語言,所以可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變數。如php,perl,tcl等。

CGI針對每個使用者請求都要開單獨的子程式去維護,所以數量多的時候會出現效能問題,最近幾年很少用。

FastCGI

CGI的升級版本,FastCGI 像是一個常駐 (long-live) 型的 CGI,它可以一直執行著,只要啟用後,不會每次都要花費時間去解析php.ini、重新載入全部dll擴充套件並重初始化全部資料結構。

PHP使用PHP-FPM(FastCGI Process Manager),全稱PHP FastCGI程式管理器進行管理。

FastCGI工作原理

  • Web Server啟動時載入FastCGI程式管理器;
  • FastCGI程式管理器自身初始化,啟動多個CGI直譯器程式並等待來自Web Server的連線;
  • 當客戶端請求到達Web Server時,FastCGI程式管理器選擇並連線到一個CGI直譯器。Web server將CGI環境變數和標準輸入傳送到FastCGI子程式php-cgi。
  • FastCGI子程式完成處理後將標準輸出和錯誤資訊從同一連線返回Web Server。當FastCGI子程式關閉連線時,請求便告處理完成。FastCGI子程式接著等待並處理來自FastCGI程式管理器的下一個連線。
  • 在正常的CGI模式中,這就結束了,下次還要重新來過。但是在FastCGI,所有這些都只在程式啟動時發生一次。一個額外的好處是,持續資料庫連線(Persistent database connection)可以工作。

Cli

PHP-CLI是PHP Command Line Interface的簡稱,就是PHP在命令列執行的介面,區別於在Web伺服器上執行的PHP環境(PHP-CGI等)。

我們在Linux下經常使用”php –m”查詢PHP安裝了那些擴充套件就是PHP命令列執行模式。 你可以打入 php -h 來看看具體都有什麼命令。

在php-cli模式下我們可以直接啟動一個php檔案並執行,就像workerman中一樣

php index.php start
複製程式碼

要說明的是,php-cli模式並沒有php執行超時的說法。

Module載入

一般是針對apache而言的,這種方式,他們的共同本質都是用 LoadModule 來載入 phpX_module,就是把php作為apache的一個子模組來執行。當通過web訪問php檔案時,apache就會呼叫phpX_module來解析php程式碼,那麼phpX_module是怎麼來將資料傳給php解析器來解析php程式碼的呢?答案是通過sapi。

所以,以上的apache呼叫php執行的過程如下:

apache -> httpd -> php5_module -> sapi -> php
複製程式碼

apache每接收一個請求,都會產生一個程式來連線php通過sapi來完成請求,可想而知,如果一旦使用者過多,併發數過多,伺服器就會承受不住了。

而且,把mod_php編進apache時,出問題時很難定位是php的問題還是apache的問題。

小結

如果要搭建一個高效能的PHP WEB伺服器,目前最佳的方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)方式了,不要再使用 Module載入或者 CGI 方式啦

相關文章