在 Linux 下執行 php 腳本時通常是可以使用以下命令:#/usr/local/php/bin/php test.php
為簡化輸入可把此php執行程序 到系統命令目錄下:
#cp /usr/local/php/bin/php /usr/sbin/
驗證:輸入以下命令,如正確獲取 php 版本,說明操作成功。
#php -v
這樣,以後再執行PHP腳本時可直接採用以下輸入方式即可。
#php a.php
② 如何獲取PHP命令行參數
如何獲取PHP命令行參數使用 PHP 開發的同學多少都會接觸過 CLI 命令行。經常會有一些定時任務或者一些腳本直接使用命令行處理會更加的方便,有些時候我們會需要像網頁的 GET 、 POST 一樣為這些命令行腳本提供參數。比如在針對某些日期做統計的腳本,就需要傳遞一個日期給它,這樣我們就統計指定日期的一些數據。這類需求應該非常常見,那麼,我們都是如何來接收這些命令行的參數的呢?今天,就來介紹一下這方面的內容。
$argv 獲得所有空格分隔的參數列表這個變數估計是大家用得比較多的一個接參變數了。它是 PHP 為我們准備好的一個固定變數,目的就是獲取傳遞給腳本的參數數組。
print_r($argv); // php 如何獲取PHP命令行參數.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd // Array // ( // [0] => 如何獲取PHP命令行參數.php // [1] => --a=1 // [2] => -b=2 // [3] => -c=3 // [4] => -d=4 // [5] => --e=5 // [6] => ccc // [7] => ddd // )這個數組是以參數間隔的空格進行分隔的。第1個元素是當前運行的腳本文件名,也就是說,不管有沒有參數,這個變數一定會有一個 $argv[0] 表示的是當前的腳本文件名。
在日常的開發需求中,其實使用這個變數就已經夠用了。但是這明顯不會是我們今天的主題,大家注意到上面的代碼中我們有很多參數是 -x=xxx 的形式,這種形式的參數是不是和 Linux 的命令選項非常像,沒錯,這就是我們今天要重點介紹的:從命令行參數列表中獲取選項。
getopt() 從命令行參數列表中獲取選項其實就是這樣一個簡單的函數,我們就可以像 Linux 的命令選項一樣獲取指定的命令值。而且不是像 $argv 按空格進行分隔,命令選項函數會將這些命令選項封裝成數組,組成以選項名為鍵,以等號後面的內容為值的數組,更加方便我們的使用。
// php 如何獲取PHP命令行參數.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd print_r(getopt('a:b:c:d:e:f:')); // Array // ( // [b] => 2 // [c] => 3 // [d] => 4 // )是不是很神奇,而且非常直觀吧,我們直接就拿到了 b 、 c 、d 的內容並且是格式非常清晰的鍵值數組形式。有同學要問了,a 和 e 呢?還有後面的 ccc 、 ddd 呢?
首先要說明的是,ccc 和 ddd 不是標準的選項參數,也就是說,這個函數接收的內容是以 - 開頭的選項,所以 ccc 和 ddd 不會在這里輸出,並且需要注意的是,非選項參數會中斷選項參數的獲取,在 ccc 之後如果繼續添加 - 開頭的選項也是無法獲取到的,這個我們後面還會看到。而 -- 開頭的選項參數呢?我們直接看下面的長選項功能。
長選項 // php 如何獲取PHP命令行參數.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd print_r(getopt('', ['a:','b:','c:','d:','e:','f:'])); // Array // ( // [a] => 1 // [e] => 5 // )沒錯,getopt() 函數的第二個參數就是定義這種 -- 開頭的長選項的,而且需要注意的是,第一個參數是字元串類型,第二個長選項參數是數組類型的。那麼我們把它們結合起來,就當然可以獲取到全部的參數信息啦!
// php 如何獲取PHP命令行參數.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd print_r(getopt('a:b:c:d:e:f:', ['a:','b:','c:','d:','e:','f:'])); // Array // ( // [a] => 1 // [b] => 2 // [c] => 3 // [d] => 4 // [e] => 5 // )OK,參數選項獲取沒問題了吧,細心的同學肯定又發現了一個問題,這個 getopt() 函數的參數中定義的選項名稱後面為啥都要加個冒號?這就涉及到我們的冒號規則了,請直接往下看。
冒號規則getopt() 的前兩個參數都支持一套關於選項獲取的規則:
單獨的字元(不接受值) 後面跟隨冒號的字元(此選項需要值) 後面跟隨兩個冒號的字元(此選項的值可選)我們還是直接通過代碼來看一下。
// 一 // php 如何獲取PHP命令行參數.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd print_r(getopt('abcdef')); // Array // ( // [b] => // [c] => // [d] => // ) // 二 // php 如何獲取PHP命令行參數.php -f print_r(getopt('f::')); // Array // ( // [f] => // ) print_r(getopt('f:')); // Array // ( // ) // 三 // php 如何獲取PHP命令行參數.php -f 22 print_r(getopt('f::')); // Array // ( // [f] => // ) print_r(getopt('f:')); // Array // ( // [f] => 22 // ) // 四 // php 如何獲取PHP命令行參數.php -f=22 print_r(getopt('f::')); // Array // ( // [f] => 22 // ) print_r(getopt('f:')); // Array // ( // [f] => 22 // )這一段比較長,我們一塊一塊來看。首先是不帶冒號的 abcdef 寫法,返回的數組中都包含鍵,但沒有值,對應上面的規則就是不接受這些參數選項的值,你傳了這些參數選項也是只有鍵名而內容是空的。
第二段是定義了一個參數,但是不給值,這時,雙冒號 :: 會有鍵名,而單冒號 : 則什麼都沒有。
第三段是空格形式的選項值,雙冒號 :: 有鍵名但沒有值,單冒號 : 鍵值正常。
第四段是等號 = 形式的選項值,單雙冒號都正常接收到鍵值。
選項參數中斷上文中我們提到過參數中斷的問題,就是在選項參數之後如果有一個非選項參數的參數出現,getopt() 就無法再獲取到這個非選項參數後面的所有內容了。
// php 如何獲取PHP命令行參數.php -f=22 aa -b=33 // 選項的解析會終止於找到的第一個非選項,之後的任何東西都會被丟棄。 // Array // ( // [f] => 22 // )通過這個測試可以清晰的看出後面的 b 選項無法獲取。這時,如果我們想知道選項參數在什麼地方或者因為哪個參數而中斷的話,就可以使用 getopt() 函數的第三個參數了。
// php 如何獲取PHP命令行參數.php -f=22 aa -b=33 $optind = null; getopt('f:b:', [], $optind); echo $optind, PHP_EOL; // 返回中斷位置的索引值,2 echo $argv[$optind], PHP_EOL; // 等同於 $argv 的索引順序,aa注釋已經寫得很清晰了,第三個參數會回調一個參數選項中斷位置的索引,並且這個索引是和 $argv 的索引順序位置一致的。
總結說實話,在沒看文檔前真的只知道有一個 $argv 變數可以用來獲取命令行腳本的參數,通過這次學習才發現原來還有一個這么強大的選項參數函數。學習的過程非常簡單,如何運用到真實的項目中才是關鍵所在,加油學習,努力實踐吧!
測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96PHP%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.php
③ php教程之php的幾種運行模式
php一共分為五大運行模式:包括cgi 、fast-cgi、cli、isapi、apache 模塊的 DLLCGI
CGI即通用網關介面(Common Gateway Interface),它是一段程序,通俗的講CGI就象是一座橋,把網頁和WEB伺服器中的執行程序連接起來,它把HTML接收的指令傳遞給伺服器的執 行程序,再把伺服器執行程序的結果返還給HTML頁。CGI 的跨平台性能極佳,幾乎可以在任何操作系統上實現。
CGI方式在遇到連接請求(用戶 請求)先要創建cgi的子進程,激活一個CGI進程,然後處理請求,處理完後結束這個子進程。這就是fork-and-execute模式。所以用cgi 方式的伺服器有多少連接請求就會有多少cgi子進程,子進程反復載入是cgi性能低下的主要原因。都會當用戶請求數量非常多時,會大量擠占系統的資源如內 存,CPU時間等,造成效能低下。CGI-FCGI
fast-cgi 是cgi的升級版本,FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全稱PHP FastCGI進程管理器進行管理。FastCGI的工作原理
1、Web Server啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Mole)
2、FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web Server的連接。
3、當客戶端請求到達Web Server時,FastCGI進程管理器選擇並連接到一個CGI解釋器。Web server將CGI環境變數和標准輸入發送到FastCGI子進程php-cgi。
4、 FastCGI子進程完成處理後將標准輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。FastCGI子進程接著等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個連接。 在CGI模式中,php-cgi在此便退出了。在上述情況中,你可以想像CGI通常有多慢。每一個Web 請求PHP都必須重新解析php.ini、重新載入全部擴展並重初始化全部數據結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的 好處是,持續資料庫連接(Persistent database connection)可以工作。APACHE2HANDLER
PHP作為Apache模塊,Apache伺服器在系統啟動後,預先生成多個進程副本駐留在內存中,一旦有請求出 現,就立即使用這些空餘的子進程進行處理,這樣就不存在生成子進程造成的延遲了。這些伺服器副本在處理完一次HTTP請求之後並不立即退出,而是停留在計 算機中等待下次請求。對於客戶瀏覽器的請求反應更快,性能較高。
apache模塊的DLL:
該運行模式是我們以前在windows環境下使用apache伺服器經常使用的,而在模塊化(DLL)中,PHP是與Web伺服器一起啟動並運行的。(是apache在CGI的基礎上進行的一種擴展,加快PHP的運行效率)ISAPI:
ISAPI即Internet Server Application Program Interface,是微軟提供的一套面向Internet服務的API介面
一個ISAPI的DLL,可以在被用戶請求激活後長駐內存,等待用戶的另一個請求,還可以在一個DLL里設置多個用戶請求處理函數,此外,
ISAPI的DLL應用程序和WWW伺服器處於同一個進程中,效率要顯著高於CGI。(由於微軟的排他性,只能運行於windows環境)cli:
cli是php的命令行運行模式,大家經常會使用它,但是可能並沒有注意到(例如:我們在linux下經常使用 「php -m」查找PHP安裝了那些擴展就是PHP命令行運行模式;有興趣的同學可以輸入php -h去深入研究該運行模式)總結:
每種運行模式都有自己的優缺點,沒有絕對的好與壞,主要是看大家處理何種環境。
④ linux伺服器上運行PHP,除了PHP-FPM還有其他的方式嗎
運行模式
關於PHP目前比較常見的五大運行模式:
1)CGI(通用網關介面/ Common Gateway Interface)
2)FastCGI(常駐型CGI / Long-Live CGI)
3)CLI(命令行運行 / Command Line Interface)
4)Web模塊模式(Apache等Web伺服器運行的模式)
5)ISAPI(Internet Server Application Program Interface)
備註:在PHP5.3以後,PHP不再有ISAPI模式,安裝後也不再有php5isapi.dll這個文件。要在IIS6上使用高版本PHP,必須安裝FastCGI 擴展,然後使IIS6支持FastCGI。
1.1、CGI模式
CGI即通用網關介面(Common Gateway Interface),它是一段程序,通俗的講CGI就象是一座橋,把網頁和Web伺服器中的執行程序連接起來,它把HTML接收的指令傳遞給伺服器的執行程序,再把伺服器執行程序的結果返還給HTML頁。CGI 的跨平台性能極佳,幾乎可以在任何操作系統上實現。CGI已經是比較老的模式了,這幾年都很少用了。
每有一個用戶請求,都會先要創建CGI的子進程,然後處理請求,處理完後結束這個子進程,這就是Fork-And-Execute模式。 當用戶請求數量非常多時,會大量擠占系統的資源如內存,CPU時間等,造成效能低下。所以用CGI方式的伺服器有多少連接請求就會有多少CGI子進程,子進程反復載入是CGI性能低下的主要原因。
如果不想把 PHP 嵌入到伺服器端軟體(如 Apache)作為一個模塊安裝的話,可以選擇以 CGI 的模式安裝。或者把 PHP 用於不同的 CGI 封裝以便為代碼創建安全的 chroot 和 setuid 環境。這樣每個客戶機請求一個PHP文件,Web伺服器就調用php.exe(win下是php.exe,linux是php)去解釋這個文件,然後再把解釋的結果以網頁的形式返回給客戶機。 這種安裝方式通常會把 PHP 的可執行文件安裝到 web 伺服器的 cgi-bin 目錄。CERT 建議書 CA-96.11 建議不要把任何的解釋器放到 cgi-bin 目錄。 這種方式的好處是把Web Server和具體的程序處理獨立開來,結構清晰,可控性強,同時缺點就是如果在高訪問需求的情況下,CGI的進程Fork就會成為很大的伺服器負擔,想 象一下數百個並發請求導致伺服器Fork出數百個進程就明白了。這也是為什麼CGI一直背負性能低下,高資源消耗的惡名的原因。
1.2、FastCGI模式
FastCGI是CGI的升級版本,FastCGI像是一個常駐 (long-live)型的 CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去 Fork 一次 (這是 CGI 最為人詬病的 fork-and-execute 模式)。
FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通信的介面。多數流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同時,FastCGI也被許多腳本語言所支持,其中就有PHP。
FastCGI介面方式採用C/S結構,可以將HTTP伺服器和腳本解析伺服器分開,同時在腳本解析伺服器上啟動一個或者多個腳本解析守護進程。當HTTP伺服器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然後將得到的結果返回給瀏覽器。這種方式可以讓HTTP伺服器專一地處理靜態請求或者將動態腳本伺服器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。
【原理】
1)Web Server啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Mole);
2)FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程 (可見多個php-cgi.exe或php-cig)並等待來自Web Server的連接;
3)當客戶端請求到達Web Server時,FastCGI進程管理器選擇並連接到一個CGI解釋器。Web server將CGI環境變數和標准輸入發送到FastCGI子進程php-cgi;
4)FastCGI子進程完成處理後將標准輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。FastCGI子進程接著等待並處理來自FastCGI進程管理器(運行在 WebServer中)的下一個連接。在正常的CGI模式中,php-cgi.exe在此便退出了。
在CGI模式中,你可以想像 CGI通常有多慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部dll擴展並重初始化全部數據結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的好處是,持續資料庫連接(Persistent database connection)可以工作。
備註:PHP的FastCGI進程管理器是PHP-FPM(PHP-FastCGI Process Manager)
【優點】
1)從穩定性上看,FastCGI是以獨立的進程池來運行CGI,單獨一個進程死掉,系統可以很輕易的丟棄,然後重新分配新的進程來運行邏輯;
2)從安全性上看,FastCGI支持分布式運算。FastCGI和宿主的Server完全獨立,FastCGI怎麼down也不會把Server搞垮;
3)從性能上看,FastCGI把動態邏輯的處理從Server中分離出來,大負荷的IO處理還是留給宿主Server,這樣宿主Server可以一心一意作IO,對於一個普通的動態網頁來說, 邏輯處理可能只有一小部分,大量的是圖片等靜態。
【缺點】
說完了好處,也來說說缺點。從我的實際使用來看,用FastCGI模式更適合生產環境的伺服器。但對於開發用機器來說就不太合適。因為當使用 Zend Studio調試程序時,由於 FastCGI會認為 PHP進程超時,從而在頁面返回 500錯誤。這一點讓人非常惱火,所以我在開發機器上還是換回了 ISAPI模式。對某些伺服器的新版本支持不好,對分布式負載均衡沒要求的模塊化安裝是否是更好的選擇。目前的FastCGI和Server溝通還不夠智能,一個FastCGI進程如果執行時間過長會被當成是死進程殺掉重起,這樣在處理長時間任務的時候很麻煩,這樣做也使得FastCGI無法允許聯機調試。因為是多進程,所以比CGI多線程消耗更多的伺服器內存,PHP-CGI解釋器每進程消耗7至25兆內存,將這個數字乘以50或100就是很大的內存數。
1.3 CLI模式
PHP-CLI是PHP Command Line Interface的簡稱,如同它名字的意思,就是PHP在命令行運行的介面,區別於在Web伺服器上運行的PHP環境(PHP-CGI,ISAPI等)。 也就是說,PHP不單可以寫前台網頁,它還可以用來寫後台的程序。 PHP的CLI Shell腳本適用於所有的PHP優勢,使創建要麼支持腳本或系統甚至與GUI應用程序的服務端,在Windows和Linux下都是支持PHP-CLI模式的。
【優點】
1)使用多進程,子進程結束以後,內核會負責回收資源;
2)使用多進程,子進程異常退出不會導致整個進程Thread退出,父進程還有機會重建流程;
3)一個常駐主進程,只負責任務分發,邏輯更清楚。
我們在Linux下經常使用"php –m"查找PHP安裝了那些擴展就是PHP命令行運行模式;有興趣的同學可以輸入"php –h"去深入研究該運行模式。
1.4 模塊模式
模塊模式是以mod_php5模塊的形式集成,此時mod_php5模塊的作用是接收Apache傳遞過來的PHP文件請求,並處理這些請求,然後將處理後的結果返回給Apache。如果我們在Apache啟動前在其配置文件中配置好了PHP模塊
(mod_php5), PHP模塊通過注冊apache2的ap_hook_post_config掛鉤,在Apache啟動的時候啟動此模塊以接受PHP文件的請求。
除了這種啟動時的載入方式,Apache的模塊可以在運行的時候動態裝載,這意味著對伺服器可以進行功能擴展而不需要重新對源代碼進行編譯,甚至根本不需要停止伺服器。我們所需要做的僅僅是給伺服器發送信號HUP或者AP_SIG_GRACEFUL通知伺服器重新載入模塊。但是在動態載入之前,我們需要將模塊編譯成為動態鏈接庫。此時的動態載入就是載入動態鏈接庫。 Apache中對動態鏈接庫的處理是通過模塊mod_so來完成的,因此mod_so模塊不能被動態載入,它只能被靜態編譯進Apache的核心。這意味著它是隨著Apache一起啟動的。
Apache是如何載入模塊的呢?我們以前面提到的mod_php5模塊為例。首先我們需要在Apache的配置文件httpd.conf中添加一行:
LoadMole php5_mole moles/mod_php5.so
這里我們使用了LoadMole命令,該命令的第一個參數是模塊的名稱,名稱可以在模塊實現的源碼中找到。第二個選項是該模塊所處的路徑。如果需要在伺服器運行時載入模塊,可以通過發送信號HUP或者AP_SIG_GRACEFUL給伺服器,一旦接受到該信號,Apache將重新裝載模塊,而不需要重新啟動伺服器。
該運行模式是我們以前在windows環境下使用apache伺服器經常使用的,而在模塊化(DLL)中,PHP是與Web伺服器一起啟動並運行的。(它是apache在CGI的基礎上進行的一種擴展,加快PHP的運行效率)。
1.5 ISAPI模式
ISAPI(Internet Server Application Program Interface)是微軟提供的一套面向Internet服務的API介面,一個ISAPI的DLL,可以在被用戶請求激活後長駐內存,等待用戶的另一個請求,還可以在一個DLL里設置多個用戶請求處理函數,此外,ISAPI的DLL應用程序和WWW伺服器處於同一個進程中,效率要顯著高於CGI。(由於微軟的排他性,只能運行於windows環境)
PHP作為Apache模塊,Apache伺服器在系統啟動後,預先生成多個進程副本駐留在內存中,一旦有請求出現,就立即使用這些空餘的子進程進行處理,這樣就不存在生成子進程造成的延遲了。這些伺服器副本在處理完一次HTTP請求之後並不立即退出,而是停留在計算機中等待下次請求。對於客戶瀏覽器的請求反應更快,性能較高。
⑤ PHP是怎麼運行的,PHP是運行
一,首先到PHP官網下載php(目前php有3個stable分支版本7.1、7.0、5.6,如果有項目需求就下載需求版本,如果是個人學習,建議下載最新版),根據32位/64位系統下載ZIP包即可,不需要Debug包,(下面我要說的是Nginx+PHP的方式,推薦使用Non Thread Safe版本):
二、到Nginx官網下載Nginx(個人學習建議Mainline版本,項目開發建議Stable版本),注意選擇windows的包!:https://nginx.org/en/download.html
三、下載完上面的兩個包後解壓即可(建議放到不經常移動的地方)。
四、用純文本編輯器打開Nginx裡面conf文件夾裡面的nginx.conf文件,進行如下編輯即可:
worker_processesauto;
events{
worker_connections1024;
}
http{
includemime.types;
default_typeapplication/octet-stream;
#access_log\.\nul;#關閉訪問日誌
sendfileon;
tcp_nopushon;
tcp_nodelayon;
keepalive_timeout65;
types_hash_max_size2048;
ssl_protocolsTLSv1.2TLSv1.1TLSv1;
ssl_prefer_server_cipherson;
gzipon;
server{
listen80default_server;
listen[::]:80default_server;
server_name_;
roothtml;#這里指定為你網站的根目錄,比如C:html,默認是相對於Nginx目錄下
indexindex.phpindex.html;
charsetutf-8;
location/{
try_files$uri$uri/=404;
}
location~.php${
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.cpp;
fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;
includefastcgi_params;
try_files$fastcgi_script_name=404;
}
}
}
<?php
phpinfo();
⑥ PHP的幾種運行模式
php一共分為五大運行模式:包括cgi 、fast-cgi、cli、isapi、apache 模塊的 DLLCGICGI即通用網關介面(Common Gateway Interface),它是一段程序,通俗的講CGI就象是一座橋,把網頁和WEB伺服器中的執行程序連接起來,它把HTML接收的指令傳遞給伺服器的執 行程序,再把伺服器執行程序的結果返還給HTML頁。CGI 的跨平台性能極佳,幾乎可以在任何操作系統上實現。CGI方式在遇到連接請求(用戶 請求)先要創建cgi的子進程,激活一個CGI進程,然後處理請求,處理完後結束這個子進程。這就是fork-and-execute模式。所以用cgi 方式的伺服器有多少連接請求就會有多少cgi子進程,子進程反復載入是cgi性能低下的主要原因。都會當用戶請求數量非常多時,會大量擠占系統的資源如內 存,CPU時間等,造成效能低下。CGI-FCGIfast-cgi 是cgi的升級版本,FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全稱PHP FastCGI進程管理器進行管理。FastCGI的工作原理1、Web Server啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Mole)2、FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web Server的連接。3、當客戶端請求到達Web Server時,FastCGI進程管理器選擇並連接到一個CGI解釋器。Web server將CGI環境變數和標准輸入發送到FastCGI子進程php-cgi。4、 FastCGI子進程完成處理後將標准輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。FastCGI子進程接著等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個連接。 在CGI模式中,php-cgi在此便退出了。在上述情況中,你可以想像CGI通常有多慢。每一個Web 請求PHP都必須重新解析php.ini、重新載入全部擴展並重初始化全部數據結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的 好處是,持續資料庫連接(Persistent database connection)可以工作。APACHE2HANDLERPHP作為Apache模塊,Apache伺服器在系統啟動後,預先生成多個進程副本駐留在內存中,一旦有請求出 現,就立即使用這些空餘的子進程進行處理,這樣就不存在生成子進程造成的延遲了。這些伺服器副本在處理完一次HTTP請求之後並不立即退出,而是停留在計 算機中等待下次請求。對於客戶瀏覽器的請求反應更快,性能較高。apache模塊的DLL:該運行模式是我們以前在windows環境下使用apache伺服器經常使用的,而在模塊化(DLL)中,PHP是與Web伺服器一起啟動並運行的。(是apache在CGI的基礎上進行的一種擴展,加快PHP的運行效率)ISAPI:ISAPI即Internet Server Application Program Interface,是微軟提供的一套面向Internet服務的API介面一個ISAPI的DLL,可以在被用戶請求激活後長駐內存,等待用戶的另一個請求,還可以在一個DLL里設置多個用戶請求處理函數,此外,ISAPI的DLL應用程序和WWW伺服器處於同一個進程中,效率要顯著高於CGI。(由於微軟的排他性,只能運行於windows環境)cli:cli是php的命令行運行模式,大家經常會使用它,但是可能並沒有注意到(例如:我們在linux下經常使用 「php -m」查找PHP安裝了那些擴展就是PHP命令行運行模式;有興趣的同學可以輸入php -h去深入研究該運行模式)總結:每種運行模式都有自己的優缺點,沒有絕對的好與壞,主要是看大家處理何種環境。PHP的幾種運行模式
⑦ 如何獲得php當前的運行模式
PHP 獲取當前運行模式,使用php_sapi_name函數即可;示例如下:
<?php
$mod=php_sapi_name();
echo$mod;
//apache2handler
//PHP有多種運行模式,例如:apache、apache2filter、apache2handler、caudium、cgi
//cgi-fcgi、cli、cli-server、continuity、embed、fpm-fcgi等等。?>
⑧ PHP 怎麼獲得當前運行的狀態
XDebug啊 很好用的 像wamp最新的集成包里就自帶了 如果你是用的nb 或者zs其他ide的話 可能需要裝插件至於__LINE__的話 就是一個魔術常量了 返回當前行
⑨ php運行機制是什麼
PHP是一種純解釋型在服務端執行的可以內嵌HTML的腳本語言,尤其適合開發Web應用程序。
請求一個 PHP 腳本時,PHP 會讀取該腳本,並將其編譯為 Zend 操作碼,這是要執行的代碼的一種二進製表示形式。隨後,此操作碼由 PHP 執行並丟棄。 PHP腳本在每次被解釋時進行初始化,在解釋完畢後終止運行。這種運行是互相獨立的,每一次請求都會創建一個單獨的進程或線程,來解釋相應的頁面文件。頁面創建的變數和其他對象,都只在當前的頁面內部可見,無法跨越頁面訪問。在終止運行後,頁面中申請的、沒有被代碼顯式釋放的外部資源,包括內存、資料庫連接、文件句柄、Socket連接等,都會被強行釋放。也就是說,PHP無法在語言級別上實現直接訪問跨越頁面的變數,也無法創建駐留內存的對象。
PHP這種獨特的工作模型的優勢在於,基本上解決了令人頭疼的資源泄漏問題。Web應用的特點是大量的、短時間的並發處理,對各種資源的申請和釋放工作非常頻繁,很容易導致泄漏甚至崩潰。PHP的運行機制決定它不存在常規的崩潰問題(頂多連接超時腳本停止執行),可以說PHP是較穩定的Web應用。但是,這種機制的缺點也非常明顯。最直接的後果是,PHP在語言級別無法實現跨頁面的緩沖機制。這種緩沖機制缺失造成的影響,可以分成兩個方面:
一是對象的緩沖。眾所周知,很多設計模式都依賴於對象的緩沖機制,創建和銷毀對象是很費時間的,因為創建一個對象要獲取內存資源或者其它更多資源,對於需要頻繁應付大量並發的服務端軟體更是如此。因此,對象緩沖的缺失,理論上會極大地降低速度。應盡可能減少創建和銷毀對象的次數來提高服務程序的效率,由於 PHP目前還不支持多線程,也就無法像Java一樣通過線程池調度來彌補這一缺陷;但可以使用第三方軟體如Memcachd來實現PHP的對象緩沖機制,達到減少對象創建和銷毀的時間來提高服務程序的效率。Memcachd將PHP編譯後的 操作碼緩存並在內存中保存這個操作碼,並在下一次調用該頁面時重用它,這會節省很多時間。比較常用的緩存還有有 eAccelerator,另一種流行的 eAccelerator 替代工具是 Alternative PHP Cache(APC)。
二是資料庫連接的緩沖。對於MySQL,PHP提供了一種內置的資料庫緩沖機制,即用mysql_pconnect()代替mysql_connect() 來打開資料庫而已。PHP會自動回收被廢棄的資料庫連接,以供重復使用。在實際應用中,這種持久性資料庫連接往往會導致資料庫連接的偽泄漏現象:在某個時間,並發的資料庫連接過多,超過了MySQL的最大連接數,從而導致新的進程無法連接資料庫。但是過一段時間,當並發數減少時,PHP會釋放掉一些連接,網站又會恢復正常。出現這種現象的原因是,當使用pconnect時,Apache 的httpd進程會不釋放connect,而當Apache的httpd進程數超過了mysql的最大連接數時,就會出現無法連接的情況。因此,需要小心地調整Apache和Mysql的配置,以使Apache的httpd進程數不會超出MySQL的最大連接數。筆者經過實踐,在PHP5和 Oracle10g的連接中,由於頻於資料庫連接,有時候還會出現資料庫丟失連接的情況(Oracle官方有針對PHP的增強包,不知是否可以解決此問題,筆者未試)。
PHP的工作模型即是缺點也是優勢,從本質上說,這就是PHP 的獨特之處。
若以FastCGI模式運行php,解析php.ini、載入全部擴展並重初始化全部數據結構這些都只在進程啟動時發生一次。一個額外的好處是,持續資料庫連接可以工作。Nginx+PHP(FastCGI)是個不錯的選擇。
⑩ PHP是怎麼運行的
PHP運行需要配置運行環境。大多數使用的是Apach,現在網上也有開發集成環境,WAMP或者XAMPP或者PHPStudy等,都可以運行PHP。