在現在這個時代,互聯網可謂是大行其道,由互聯網帶動的各行各業蓬勃發展,也正是因爲及時抓住的互聯網帶來的發展機遇,成就了一大批科技巨頭,他們利用互聯網技術推出了一大批科技產品,這些科技產品在給人們帶來方便、快捷的生活的同時,也在慢慢改變着世界。php
在這科技大繁榮的背景之下,有着無數的技術在提供支持,更有衆多的科技人才在不斷髮展和完善技術;在IT這個大圈兒中,有着各式各樣的從業者,他們在用本身的實力在不斷推動各類技術,使之不斷完善,也正由於如此,他們活躍在各個技術社區、論壇不斷討論着遇到的坑、爭論着哪一個語言纔是最好的開發語言。nginx
因此便有了這樣的梗,「若是你想引起一場大型爭論,那就去Java
社區討論 PHP
是世界上最好的語言」。引起這個梗不是別人,正是php
語言2001
年的官方文檔:程序員
PHP is the best language for web programming, but what about other languages?
Because PHP is the best language ever, ever. It's fast, very powerful, and free.
因此,跟我絕對不要緊,說真的。web
今天要分享的內容也和「世界最好的語言 PHP
」有關:是關於thinkphp
的,提到 thinkphp
這個詞,不少從事開發的小夥伴都不會陌生,特別php
語言領域的開發者們;
這是一款國人開發的php
集成開發環境,目前在中國的php
語言領域有着不小的影響力,我本身也有很多的接觸,通過一段時間的使用下來,感受還不錯。若是有感興趣的的同好們,能夠去官網下載來嘗試一番。thinkphp
相似這樣的集成開發環境還有也有不少優秀的案例,好比:Laravel 、Yii、CodeIgniter
等,都是值得一試的。apache
那麼,我做爲一個Java
程序員,爲何會來分享PHP
的內容呢?緣由其實很簡單,公司須要,這個理由足矣。項目也不是很大,功能也比較簡單,因此前期的開發、測試都比較順利;但當我把項目開發完成並部署完畢後,我意識到了問題,因爲開發和部署都是使用的成熟的php
集成環境,因此我對於PHP
的整個運行過程並不瞭解,總有一種飄在空中的感受;因此,我決定,拋開集成環境,獨自手動部署一個thinkphp
的運行環境。編程
Web Server 和 Web Applicationwindows
web
開發中,會常常提到web server
、web appliction
這兩個詞,不少時候都容易由於定義不當產生歧義,下面就來簡單作個介紹:瀏覽器
Web Server
: 即web
服務器,一般指的是Apache、Nginx、IIS、Lighttpd、Tomcat、Wildfly
等軟件;Web Appliction
: 即web
應用程序,一般指的是使用編程語言開發的項目程序;項目(web application
)開發完成後,須要通過編譯,而後交由web
服務器運行。緩存
技術方案的選擇
在正式開始環境部署前,須要作一些準備工做,正所謂借東風以前,不得先萬事俱備嘛。一般php
的運行環境有多種成熟穩定的方案可供選擇,下面是較爲成熟的兩種:
PHP + Apache
:以 ISAPI
方式運行PHP
項目,PHP
版本選擇爲TS
(即線程安全版);該種方式配置較爲負責,配置過程很容易因人爲配置而出錯,但這種方案的穩定性要更高;PHP + Nginx
:以 FAST-CGI/PHP-FPM
方式運行PHP
項目,PHP
版本選擇爲NTS
(即線程不安全版);這種方式配置較少,對高併發、高負載有良好的表現,但穩定性卻不如Apache
;方案細節的敲定
咱們這裏選擇的是後一種,即:PHP + Nginx
,因此php
的版本就要選擇nts
版,如下是須要的軟件:
windows
操做系統;nginx 1.13+
;提供php
項目運行環境支持;thinkphp 5+
;php
項目;php-nts-5.6
;php
語言支持,php
做爲解釋型語言,須要安裝官方提供的語言解釋器,方能解釋執行php
代碼;之因此選擇nts
版,是由於選擇了Nginx
做爲服務器;而後將二、三、4
中的軟件下載、解壓,等待使用。
這裏咱們選擇的版本是php 5.6
,在下載php
的時候,會發現有不一樣的版本可選擇,以下圖所示:
PHP
提供了nts
版和ts
版,分別是線程安全不版本和線程安全版本,兩個版本有着很大的不一樣:
ts版
:即線程安全版,其在多線程訪問時,採用了加鎖機制,可以保證同一個數據或者操做同一個時間點只能被一個線程訪問操做,從而避免多個線程同時操做一個數據致使的髒數據問題;但其在性能上要比nts
版差一些,適用於對數據安全要求比較高的場景。nts
版:即線程不安全版,在多線程訪問時不提供數據訪問保護,有可能出現多個線程前後或同時操做同一數據的狀況,從而可能形成數據錯亂;但nts
版卻有着更好的性能,適用於不太注重數據安全,須要更好性能的場景。本文選擇 nts
版 ,點擊Zip
下載PHP
程序包,而後解壓,獲得以下的目錄:
php.exe
:PHP
執行工具,能夠在CMD
命令執行命令php.exe xxx.php
來運行PHP
文件。
php-cgi.exe
:PHP解釋器,爲CGI
提供的執行工具,在web
項目總會常用。
php-win.exe
:也能夠執行PHP
文件,區別是會打開控制檯,但不顯示輸出內容。能夠用來編寫無需顯示界面的文件處理、網路服務等程序。
phpdbg.exe
:php
開發的調試工具。
php.ini
:php
的配置文件,包括php
擴展的安裝、session
路徑、文件大小等諸多配置,如需修改php
的配置,打開文件修改便可。
運行php-cgi
接下來,即是將php-cgi
運行起來以待後續使用:
php
根目錄下打開cmd
命令;php-cgi.exe -b 127.0.0.1:9000 -c "php.ini"
;php-cgi
便以127.0.0.1:9000
運行起來了;
php-cgi運行問題
如果在運行php-cgi
命令時出現如下的問題,則說明系統缺乏Visual C++ Redistributable Package
,須要下載安裝;
問題的解決
1. 下載Visual C++ Redistributable Package
(下載連接:下載Visual C++ Redistributable Package);
2. 選擇64
位的安裝包;
3. 下載完成後點擊安裝便可;
4. 從新回到cmd
中運行php-cgi
,問題已解決;
在網站的總體架構中,Web Server
軟件(如nginx、apache、httpd
等)執行的是內容的分發者,對客戶端的請求進行響應。對於靜態資源請求,他們會去設置的路徑下尋找,而後返回,若是沒找到,則會返回錯誤信息;對於動態請求,他們會把數據傳遞給對應的程序來處理,而後把程序處理結果返回。
CGI
CGI
是 Web Server
與 Web Application
之間數據交換的一種協議,全稱是公共網關接口(Common Gateway Interface,CGI
),可以實現瀏覽器和服務器之間的數據交互。CGI
不是一門編程語言,其也不屬於任何一門語言,可是大多數語言都提供了對CGI
的支持。
CGI
是一種通訊協議,它會把用戶提交的數據轉換成一個k-v
的字典。CGI
自己並不負責傳輸數據,數據傳輸是依靠socket
完成的。用戶每次發送CGI
請求的時候,Web Server
軟件都會生成一個新的CGI
解釋器進程(如php-cgi.exe
),當CGI
腳本處理完請求後,CGI
解釋器進程就會被Web Server
釋放;這個過程被稱爲fork-and-execute
模式。
fork-and-execute
模式在高併發的場景下會由於重複建立、銷燬CGI
解釋進程而耗費大量的服務器資源,使得服務器的運行性能低下。爲了解決這個問題,FastCGI
應運而生。
FastCGI
FastCGI
也是 Web Server
與 Web Application
之間數據交換的一種協議,其是CGI
的擴展版本,在執行效率上要比CGI
高不少。FastCGI
就像是一個常駐(long-live
)型的CGI
,它能夠一直執行着,只要激活後,不會每次都要花費時間去fork
一次。
FastCGI
一樣是與語言無關的、可伸縮架構的CGI
開放擴展,CGI
性能低下的主要緣由是CGI
解釋器的反覆加載,而FastCGI
主要行爲就是將CGI
解釋器進程保持在內存中,並由FastCGI
進程管理器進行調度,所以來提升運行性能。
PHP-CGI
PHP-CGI
是PHP
官方實現的FastCGI
管理器,但他只是個CGI
程序,他本身自己只能解析請求,返回結果,不會管理進程。
PHP-FPM
PHP-FPM
是PHP
語言對於 FastCGI
協議的具體實現,他負責管理一個進程池,來處理來自Web
服務器的請求,不只如此,PHP-FPM
也是用於調度管理PHP
解析器php-cgi
的管理程序。PHP5.3
版本以後,PHP-FPM
是內置於PHP
內核的,不須要單獨下載。
對於php.ini
文件的修改,php-cgi
進程是沒辦法平滑重啓的,每次修改php.ini
都須要重啓php-cgi
進程;但有了php-fpm
後,對於php.ini
的修改就能實現平滑重啓。但php-fpm
在windows
下並無得到支持,若是想要體驗,能夠選擇Linux
環境。
Nginx
是一款輕量級的Web
服務器、反向代理服務器、電子郵件(IMAP/POP3/SMTP
)代理服務器,運行時佔有內存少,併發能力強;是由俄羅斯程序員伊戈爾·賽索耶夫開發的,自2004
年開源公開。
目錄介紹
模塊介紹
文件conf/nginx.conf
是nginx
的服務配置文件,在配置文件中能夠對nginx
作網絡基礎配置、虛擬主機綁定、反向代理,負載均衡等衆多靈活、強大的配置,如下是一些主要的模塊:
1. 全局塊
全局塊是配置文件從開始到events
塊之間的一部分內容,主要設置一些影響nginx
服務器總體運行的配置指令,所以這些指令做用域是整個nginx
服務器全局。這些配置指令包括:用戶(組)、worker process
數、pid
路徑、日誌路徑等。
2. events塊
events
塊涉及的設置指令包括是否開啓對多worker process
下的網絡鏈接進行序列化,是否容許同時接收多個網絡鏈接,選取哪一種事件驅動模型處理鏈接請求,每一個worker process
能夠同時支持的最大鏈接數。
3. http塊
http
塊在nginx
配置中尤其重要,代理、緩存、日誌定義、文件類型,網絡基礎配置等絕大多數的功能和第三方模塊的配置均可以放在這個模塊中。具體包括文件引入、mime-type
定義、日誌自定義、是否使用sendfile
轉輸文件、鏈接超時時間、單鏈接請求數上限等。
4.server塊
每一個server
塊就是一個綁定的虛擬主機,都是一組服務(或網站)。一個http
中能夠有多個server
。每一個server
塊能夠包含多個location
塊。
每一個綁定的網站的域名和端口都是配置在server
塊中的,其餘還包括有路由配置,訪問設備判斷等一個所須要的所有數據。
5. location塊
用於配置請求的路由,以及各類頁面的處理狀況。每一個server
塊中能夠包含多個location
塊,location
是server
塊的一個指令,基於nginx
服務器接收到的請求字符串(例如:server_name
或 url_string
),對除虛擬主機名稱(或ip
) 以外的字符串如url_stirng
進行匹配,對特定的請求進行處理。地址定向、數據緩存、和應答控制等功能都是在這部分實現。
這裏的配置多與應用程序相關。
運行命令
在cmd
中打開nginx
根目錄,便可對nginx
執行運行命令;
Nginx
的版本號:nginx -V
nginx -t
nginx
:start nginx
nginx -s reload
Nginx
:nginx -s stop
Nginx
:nginx -s quit
php 運行配置
nginx
運行php
項目須要fastcgi
的支持,所以須要在nginx
中引入fastcgi
的配置;因爲項目是使用thinkphp
的,所以須要定位到項目中的public
目錄下;因此,完整的配置以下:
1.在http
模塊中,server
塊以前加入以下的配置:
2.server
塊完整配置以下:
3.nginx
配置完成,便可經過配置的域名和端口訪問項目;至此配置完成。
主動出擊,不是語言選擇人,是人選擇語言。堅持學習纔是王道。若是有小夥伴須要以上完整配置的,能夠私信我獲取。
完結,老夫雖不正經,但老夫一身的才華!關注我,獲取更多編程科技知識。