CGI的發展歷程

什麼是CGI?

CGI是一種協議,經過這種協議(或約定的規則),WEB服務器能夠和應用程序進行數據交互處理。php

CGI包含三個方面:前端

  • 環境變量(請求類型,請求IP..)
  • 標準輸入(請求主體)
  • 標準輸出(請求響應)

簡而言之,CGI在環境變量中,描述了請求的基本信息;在標準輸入中,描述了請求主體是如何傳入的;在標準輸出中,描述了請求響應是如何輸出的。segmentfault

什麼是FASTCGI?

FASTCGI 是 CGI 的改進方案,主要優勢是把動態語言和 HTTP Server 分離開來。服務器

所以 Nginx 與 PHP/PHP-FPM 常常被部署在不一樣的服務器上,以分擔前端 Nginx 服務器的壓力。數據結構

使 Nginx 專注處理靜態請求和轉發動態請求,而 PHP/PHP-FPM 服務器專注解析 PHP 動態請求。併發

區別

CGIapp

  • 每次請求PHP都要從新解析php.ini,從新加載所有擴展和初始化數據結構
  • fork-and-execute模式
  • 高併發時,效率低

FASTCGI高併發

  • 採用C/S結構,HTTP服務器和腳本解析服務器分離,多個腳本解析守護進程
  • 擴展加載和數據結構初始化,在進程啓動時只發生一次
  • 多個CGI程序保持在內存中,接受FastCGI進程管理器調度

FastCGI原理圖spa

請輸入圖片描述

Nginx 將 CGI 請求發送給 Socket:pwa

  • 經過 FastCGI 接口,Wrapper 接收到請求,而後派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據
  • Wrapper 再將返回的數據經過 FastCGI 接口,沿着固定的 Socket 傳遞給 Nginx
  • Nginx 將返回的數據發送給客戶端

PHP-FPM

PHP-FPM 是 FASTCGI 協議的一種實現,在 PHP5.3.× 版本中就開始內置該進程管理器。

Spawn-fcgi

Spawn-fcgi是 HTTP 服務器 lighttpd 的一部分,目前已經獨立成爲一個項目,通常與 lighttpd 配合使用來支持PHP。

可是 ligttpd 的spwan-fcgi 在高併發訪問的時候,會出現內存泄漏甚至自動重啓 FastCGI 的問題。

相關文章
相關標籤/搜索