本話題來自於我使用PHP進行網頁爬蟲的一次經歷。對於一個web開發者來講,PHP解釋器自己卻知之甚小,實在是慚愧吶!php
首先這個話題要從幾個提問開始。html
外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」,是一種通用開源腳本語言。node
所謂超文本預處理器本意是在HTML等這樣的文本發送給瀏覽器前先進行服務器端的處理,從而實現動態發送本來靜態的文件。PHP創始人本意是爲了提供動態網頁開發的便捷性,爲web開發提供了預處理模塊,因此說早期的PHP更像是一款web開發工具集,後來PHP開發變得龐大,獨立成爲一個解釋器,並有了本身的語言規範。python
知道起源的緣由是須要咱們明白一點:PHP是爲web開發而生,但後來他太強了獨立成了新語言!nginx
故而PHP最原始的思想是與web服務器進行精密的結合,那麼如何將語言和服務器軟件結合?這就引起下面的問題了。web
諸如:Nginx,apache,IIS,tomcat,還有一些語言內置諸如nodejs,能提供web功能的軟件,實現http協議的服務軟件都稱爲web軟件,安裝了這些軟件的服務器就叫作web服務器。(web與http關係就是,web是一個創建在http協議上的軟件集合,web軟件是一種實現,http只是一種協議)。web軟件最基礎的功能是request,response,也就是能處理用戶的請求和響應他們。因此PHP,Python,ruby什麼的語言自己與他們沒有半毛錢的關係。算法
php_modapache
提到PHP如何在apache的服務器上跑起來,就得提到apache下的一個模塊,php_mod,就是這個模塊讓PHP解釋器成爲apache的一個子進程,子模塊,讓apache能夠建立調用PHP進程,從而實現了所謂的LAMP,WAMP架構。編程
這種狀況下php和apache是一種從屬關係,apache啓動時須要加載php模塊,讀取php.ini文件,一個最明顯的特色是:在CGI模式下修改php.ini後不須要重啓web服務器,而php_mod模式下修改php.ini則須要重啓apache。網頁爬蟲
fast-cgi
提到nginx如何跑php,就不得不提到fast-cgi,要說fast-cgi就得說cgi是個什麼東西。
cgi:協議,web軟件和腳本語言之間通訊的規範,目的就是讓web軟件可以規範調用那些腳本語言,諸如php,python,js等的解釋器。
fast-cgi:實現,fast-cgi就是cgi的一種實現,Nginx用的就是這種實現,因此Nginx能夠和php進行「通訊」。
Nginx這種cgi模式與apache最大區別就是,php與nginx兩個軟件互相獨立運行,Nginx須要執行php文件就交給php-fpm去作,處理完結果按照cgi規範返回給Nginx,Nginx處理完髮送給用戶。
除此之外,fast-cgi在cgi原有規範上還作了改進,cgi本來的規定是每個請求都建立一個新的進程或者線程,結束後關閉,這樣最大缺點是一開一關很消耗性能。因而fast-cgi的作法是在web服務器同時也啓動一個進程,並預先啓動子進程,線程,放在進程池中等待web請求過來,這樣nginx一旦有請求過來,就能立馬進行處理,再也不一開一關進程了,這樣效率,性能獲得顯著的提高。
正是由於cgi只是一個通訊協議,它還支持分佈式的運算,即fast-cgi程序能夠在網站服務器之外的主機上執行而且接受來自其餘網站服務器的請求。
FastCGI整個流程:
php-fpm
php-fpm是php的fast-cgi的進程管理器。
php-cli
早就說過,如今的php已是一門獨立的腳本語言,因此php提供了cli編程,GUI編程,還保留了最重要的web編程。php-cli實際就是一個語言解釋器,若是使用php只是進行爬蟲,算法開發,只須要安裝php-cli便可,什麼cgi,fpm都不須要了,在windows下稱做php.exe,只要有了cli,直接就能夠在cmd下解析php文件了。
不少人用多了apache,nginx,並不知道php和nodejs同樣,自帶了webserver模塊,能夠直接經過php啓動80端口監聽的webserver。
以下:
php -S 127.0.0.1:8080 -t /var/www/html/