日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

php cli和fastcgi,php的几种运行模式CLI、CGI、FastCGI、mod_php

發(fā)布時間:2023/12/10 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php cli和fastcgi,php的几种运行模式CLI、CGI、FastCGI、mod_php 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、CLI:就是命令行,例如可以在控制臺或者是shell中鍵入命令:

php -f index.php

然后獲取輸出

2、CGI:以下是不同的說法與理解

公共網(wǎng)關(guān)接口”(Common Gateway Interface),HTTP服務(wù)器 與你的或其它機器上的程序 進行 “交談”的一種工具 ,其程序 須運行在網(wǎng)絡(luò) 服務(wù)器 上。在服務(wù)器 環(huán)境中,為“程序 ”提供標準 的接口,通過這個接口,“程序 ”可以對服務(wù)器 與客戶端 交換的信息 做一些事情 。“程序 ”的語 言并沒有要求。程序 對接口進行 操作。服務(wù)器 要支持 CGI就要提供CGI中要求的環(huán)境變量 ,或者還有別的。

HTTP Server和一個獨立的進程之間的協(xié)議,把HTTP Request的Header設(shè)置成進程的環(huán)境變量,HTTP Request的正文設(shè)置成進程的標準輸入,而進程的標準輸出就是HTTP Response包括Header和正文。

這個 Web 服務(wù)器使用了 UNIX shell 環(huán)境變量 來保存從 Web 服務(wù)器傳遞出去的參數(shù),然后生成一個運行 CGI 的獨立進程。

不同類型語言寫的程序只要符合cgi標準,就能作為一個cgi程序與web服務(wù)器交互

以CGI方式運行時,web server將用戶請求以消息的方式轉(zhuǎn)交給PHP獨立進程,PHP與web服務(wù)之間無從屬關(guān)系。

個人理解:CGI規(guī)定了php與web server交流的規(guī)則,相當于執(zhí)行了response = exec("php -f index.php -url=xxx -cookie=xxx -xxx=xxx")。

關(guān)于CGI與CLI區(qū)別可以查看官方文檔說的挺不錯的:http://php.net/manual/zh/features.commandline.php

文中闡述了CGI與CLI的顯著區(qū)別:

以下為 CLI SAPI 和其它 CLI SAPI 模塊相比的顯著區(qū)別:

與 CGI SAPI 不同,其輸出沒有任何頭信息。

盡管 CGI SAPI 提供了取消 HTTP 頭信息的方法,但在 CLI SAPI 中并不存在類似的方法以開啟 HTTP 頭信息的輸出。

CLI 默認以安靜模式開始,但為了保證兼容性,-q 和 –no-header 參數(shù)為了向后兼容仍然保留,使得可以使用舊的 CGI 腳本。

在運行時,不會把工作目錄改為腳本的當前目錄(可以使用 -C 和 –no-chdir 參數(shù)來兼容 CGI 模式)。

出錯時輸出純文本的錯誤信息(非 HTML 格式)。

3、FastCGI:CGI有很多缺點,每接收一個請求就要fork一個進程處理,只能接收一個請求作出一個響應(yīng)。請求結(jié)束后該進程就會結(jié)束。而FastCGI會事先啟動起來,作為一個cgi的管理服務(wù)器存在,預(yù)先啟動一系列的子進程來等待處理,然后等待web服務(wù)器發(fā)過來的請求,一旦接受到請求就交由子進程處理,這樣由于不需要在接受到請求后啟動cgi,會快很多。FastCGI使用進程/線程池來處理一連串的請求。這些進程/線程由FastCGI服務(wù)器管理,而不是Web服務(wù)器。 當進來一個請求時,Web服務(wù)器把環(huán)境變量和這個頁面請求通過一個Socket長連接傳遞給FastCGI進程。FastCGI像是一個常駐型的CGI,它可以一直執(zhí)行,在請求到達時不會花費時間去fork一個進程來處理(這是CGI對位人詬病的fork-and-execute模式)。正是因為它只是一個通信協(xié)議,它還支持分布式的運算,即FastCGI程序可以在網(wǎng)站服務(wù)器以外的主機上執(zhí)行并且接受來自其他網(wǎng)站服務(wù)器的請求

FastCGI整個流程:

Web server啟動時載入FastCGI進程管理器

FastCGI自身初始化,啟動多個CGI解釋器進程(可見多個php-cgi)并等待來自Web server的請求

當請求Web server時,Web server通過socket請求FastCGI進程管理器,FastCGI進程管理器選擇并連接到一個CGI解釋器,Web server將CGI環(huán)境變量和標準輸入發(fā)送到FastCGI子進程php-cgi

FastCGI子進程處理請求完成后將標準輸出和錯誤從同一連接返回給Web server,當FastCGI子進程結(jié)束后請求便結(jié)束。FastCGI子進程接著等待處理來自FastCGI進程管理器的下一個連接,在CGI模式中,php-cgi在此便退出了。

php-fpm:PHP的FastCGI進程管理器

4、mod_php:即apache的php模塊,將PHP做為web-server的子進程控制,兩者之間有從屬關(guān)系.最明顯的例子就是在CGI模式下,如果修改了PHP.INI的配置文件,不用重啟web服務(wù)便可生效,而模塊模式下則需要重啟web服務(wù)。以mod_php模式運行PHP,意味著php是作為apache的一個模塊來啟動的,因此只有在apache啟動的時候會讀取php.ini配置文件并加載擴展模塊,在apache運行期間是不會再去讀取和加載擴展模塊的

Apache的工作模式 prefork的工作原理

一個單獨的控制進程(父進程)負責產(chǎn)生子進程,這些子進程用于監(jiān)聽請求并作出應(yīng)答。Apache總是試圖保持一些備用的 (spare)或是空閑的子進程用于迎接即將到來的請求。這樣客戶端就無需在得到服務(wù)前等候子進程的產(chǎn)生。在Unix系統(tǒng)中,父進程通常以root身份運行以便邦定80端口,而 Apache產(chǎn)生的子進程通常以一個低特權(quán)的用戶運行。User和Group指令用于配置子進程的低特權(quán)用戶。運行子進程的用戶必須要對他所服務(wù)的內(nèi)容有讀取的權(quán)限,但是對服務(wù)內(nèi)容之外的其他資源必須擁有盡可能少的權(quán)限。

worker的工作原理

每個進程能夠擁有的線程數(shù)量是固定的。服務(wù)器會根據(jù)負載情況增加或減少進程數(shù)量。一個單獨的控制進程(父進程)負責子進程的建立。每個子進程能夠建立ThreadsPerChild數(shù)量的服務(wù)線程和一個監(jiān)聽線程,該監(jiān)聽線程監(jiān)聽接入請求并將其傳遞給服務(wù)線程處理和應(yīng)答。Apache總是試圖維持一個備用(spare)或是空閑的服務(wù)線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。在Unix中,為了能夠綁定80端口,父進程一般都是以root身份啟動,隨后,Apache以較低權(quán)限的用戶建立子進程和線程。User和Group指令用于配置Apache子進程的權(quán)限。雖然子進程必須對其提供的內(nèi)容擁有讀權(quán)限,但應(yīng)該盡可能給予他較少的特權(quán)。另外,除非使用了suexec ,否則,這些指令配置的權(quán)限將被CGI腳本所繼承

總結(jié)

以上是生活随笔為你收集整理的php cli和fastcgi,php的几种运行模式CLI、CGI、FastCGI、mod_php的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。