「PHP」不依賴集成環境,使用Nginx手動配置Thinkphp運行環境

在現在這個時代,互聯網可謂是大行其道,由互聯網帶動的各行各業蓬勃發展,也正是因爲及時抓住的互聯網帶來的發展機遇,成就了一大批科技巨頭,他們利用互聯網技術推出了一大批科技產品,這些科技產品在給人們帶來方便、快捷的生活的同時,也在慢慢改變着世界。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

使用Nginx部署Thinkphp運行環境

今天要分享的內容也和「世界最好的語言 PHP」有關:是關於thinkphp的,提到 thinkphp 這個詞,不少從事開發的小夥伴都不會陌生,特別php語言領域的開發者們;
這是一款國人開發的php集成開發環境,目前在中國的php語言領域有着不小的影響力,我本身也有很多的接觸,通過一段時間的使用下來,感受還不錯。若是有感興趣的的同好們,能夠去官網下載來嘗試一番。thinkphp

相似這樣的集成開發環境還有也有不少優秀的案例,好比:Laravel 、Yii、CodeIgniter等,都是值得一試的。apache

事情的緣起

那麼,我做爲一個Java 程序員,爲何會來分享PHP的內容呢?緣由其實很簡單,公司須要,這個理由足矣。項目也不是很大,功能也比較簡單,因此前期的開發、測試都比較順利;但當我把項目開發完成並部署完畢後,我意識到了問題,因爲開發和部署都是使用的成熟的php集成環境,因此我對於PHP 的整個運行過程並不瞭解,總有一種飄在空中的感受;因此,我決定,拋開集成環境,獨自手動部署一個thinkphp的運行環境。編程

前期準備

Web Server 和 Web Applicationwindows

web開發中,會常常提到web serverweb appliction 這兩個詞,不少時候都容易由於定義不當產生歧義,下面就來簡單作個介紹:瀏覽器

  • Web Server web服務器,一般指的是Apache、Nginx、IIS、Lighttpd、Tomcat、Wildfly等軟件;
  • Web Applictionweb應用程序,一般指的是使用編程語言開發的項目程序;

項目(web application)開發完成後,須要通過編譯,而後交由web服務器運行。緩存

技術方案的選擇

在正式開始環境部署前,須要作一些準備工做,正所謂借東風以前,不得先萬事俱備嘛。一般php的運行環境有多種成熟穩定的方案可供選擇,下面是較爲成熟的兩種:

  • PHP + Apache :以 ISAPI 方式運行PHP項目,PHP版本選擇爲TS(即線程安全版);該種方式配置較爲負責,配置過程很容易因人爲配置而出錯,但這種方案的穩定性要更高;
  • PHP + Nginx :以 FAST-CGI/PHP-FPM 方式運行PHP項目,PHP版本選擇爲NTS(即線程不安全版);這種方式配置較少,對高併發、高負載有良好的表現,但穩定性卻不如Apache

方案細節的敲定

咱們這裏選擇的是後一種,即:PHP + Nginx,因此php的版本就要選擇nts版,如下是須要的軟件:

  1. 能正常運行的電腦一臺,windows操做系統;
  2. nginx 1.13+;提供php項目運行環境支持;
  3. thinkphp 5+php項目;
  4. php-nts-5.6php 語言支持,php做爲解釋型語言,須要安裝官方提供的語言解釋器,方能解釋執行php代碼;之因此選擇nts版,是由於選擇了Nginx做爲服務器;
  5. 正經程序員一枚,這個尤其重要;

而後將二、三、4中的軟件下載、解壓,等待使用。

PHP 安裝配置

這裏咱們選擇的版本是php 5.6,在下載php的時候,會發現有不一樣的版本可選擇,以下圖所示:

php 版本選擇

PHP 提供了nts版和ts版,分別是線程安全不版本和線程安全版本,兩個版本有着很大的不一樣:

  • ts版:即線程安全版,其在多線程訪問時,採用了加鎖機制,可以保證同一個數據或者操做同一個時間點只能被一個線程訪問操做,從而避免多個線程同時操做一個數據致使的髒數據問題;但其在性能上要比nts版差一些,適用於對數據安全要求比較高的場景。
  • nts:即線程不安全版,在多線程訪問時不提供數據訪問保護,有可能出現多個線程前後或同時操做同一數據的狀況,從而可能形成數據錯亂;但nts版卻有着更好的性能,適用於不太注重數據安全,須要更好性能的場景。

本文選擇 nts ,點擊Zip下載PHP程序包,而後解壓,獲得以下的目錄:

php 安裝目錄

php.exePHP執行工具,能夠在CMD命令執行命令php.exe xxx.php來運行PHP文件。

php-cgi.exe:PHP解釋器,爲CGI提供的執行工具,在web項目總會常用。

php-win.exe:也能夠執行PHP文件,區別是會打開控制檯,但不顯示輸出內容。能夠用來編寫無需顯示界面的文件處理、網路服務等程序。

phpdbg.exephp開發的調試工具。

php.iniphp的配置文件,包括php擴展的安裝、session路徑、文件大小等諸多配置,如需修改php的配置,打開文件修改便可。

運行php-cgi

接下來,即是將php-cgi運行起來以待後續使用:

  1. php根目錄下打開cmd命令;
  2. 輸入命令:php-cgi.exe -b 127.0.0.1:9000 -c "php.ini"
  3. php-cgi便以127.0.0.1:9000運行起來了;

php-cgi 命令運行成功

php-cgi運行問題

如果在運行php-cgi命令時出現如下的問題,則說明系統缺乏Visual C++ Redistributable Package,須要下載安裝;

MSVCR110.dll文件的缺失

問題的解決

1. 下載Visual C++ Redistributable Package
(下載連接:下載Visual C++ Redistributable Package);

下載Visual C++ Redistributable Packa

2. 選擇64位的安裝包;

選擇64位的安裝包

3. 下載完成後點擊安裝便可;

4. 從新回到cmd中運行php-cgi,問題已解決;

FastCGI

在網站的總體架構中,Web Server軟件(如nginx、apache、httpd等)執行的是內容的分發者,對客戶端的請求進行響應。對於靜態資源請求,他們會去設置的路徑下尋找,而後返回,若是沒找到,則會返回錯誤信息;對於動態請求,他們會把數據傳遞給對應的程序來處理,而後把程序處理結果返回。

CGI

CGIWeb ServerWeb 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 ServerWeb Application 之間數據交換的一種協議,其是CGI 的擴展版本,在執行效率上要比CGI高不少。FastCGI就像是一個常駐(long-live)型的CGI,它能夠一直執行着,只要激活後,不會每次都要花費時間去fork一次。

FastCGI一樣是與語言無關的、可伸縮架構的CGI開放擴展,CGI性能低下的主要緣由是CGI解釋器的反覆加載,而FastCGI主要行爲就是將CGI解釋器進程保持在內存中,並由FastCGI進程管理器進行調度,所以來提升運行性能。

PHP-CGI

PHP-CGIPHP官方實現的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-fpmwindows下並無得到支持,若是想要體驗,能夠選擇Linux環境。

Nginx 配置

Nginx是一款輕量級的Web 服務器、反向代理服務器、電子郵件(IMAP/POP3/SMTP)代理服務器,運行時佔有內存少,併發能力強;是由俄羅斯程序員伊戈爾·賽索耶夫開發的,自2004年開源公開。

目錄介紹

nginx 目錄介紹

模塊介紹

文件conf/nginx.confnginx的服務配置文件,在配置文件中能夠對nginx作網絡基礎配置、虛擬主機綁定、反向代理,負載均衡等衆多靈活、強大的配置,如下是一些主要的模塊:

1. 全局塊

  全局塊是配置文件從開始到events塊之間的一部分內容,主要設置一些影響nginx服務器總體運行的配置指令,所以這些指令做用域是整個nginx服務器全局。這些配置指令包括:用戶(組)、worker process數、pid路徑、日誌路徑等。

全局塊

2. events塊

events塊涉及的設置指令包括是否開啓對多worker process下的網絡鏈接進行序列化,是否容許同時接收多個網絡鏈接,選取哪一種事件驅動模型處理鏈接請求,每一個worker process能夠同時支持的最大鏈接數。

events塊

3. http塊

 http塊在nginx配置中尤其重要,代理、緩存、日誌定義、文件類型,網絡基礎配置等絕大多數的功能和第三方模塊的配置均可以放在這個模塊中。具體包括文件引入、mime-type定義、日誌自定義、是否使用sendfile轉輸文件、鏈接超時時間、單鏈接請求數上限等。

http塊

4.server塊

  每一個server塊就是一個綁定的虛擬主機,都是一組服務(或網站)。一個http中能夠有多個server。每一個server塊能夠包含多個location塊。

  每一個綁定的網站的域名和端口都是配置在server塊中的,其餘還包括有路由配置,訪問設備判斷等一個所須要的所有數據。

server塊

5. location塊

  用於配置請求的路由,以及各類頁面的處理狀況。每一個server塊中能夠包含多個location塊,locationserver塊的一個指令,基於nginx服務器接收到的請求字符串(例如:server_nameurl_string),對除虛擬主機名稱(或ip) 以外的字符串如url_stirng進行匹配,對特定的請求進行處理。地址定向、數據緩存、和應答控制等功能都是在這部分實現。

這裏的配置多與應用程序相關。

location塊

運行命令

cmd中打開nginx根目錄,便可對nginx執行運行命令;

  • 查看Nginx的版本號:nginx -V
  • 配置檢查:nginx -t
  • 啓動nginxstart nginx
  • 配置文件修改重裝載命令:nginx -s reload
  • 快速中止或關閉Nginxnginx -s stop
  • 正常中止或關閉Nginxnginx -s quit

php 運行配置

nginx 運行php項目須要fastcgi的支持,所以須要在nginx中引入fastcgi的配置;因爲項目是使用thinkphp的,所以須要定位到項目中的public目錄下;因此,完整的配置以下:

1.在http模塊中,server塊以前加入以下的配置:

fastcgi 配置

2.server塊完整配置以下:

server 塊配置

3.nginx配置完成,便可經過配置的域名和端口訪問項目;至此配置完成。

小結

主動出擊,不是語言選擇人,是人選擇語言。堅持學習纔是王道。若是有小夥伴須要以上完整配置的,能夠私信我獲取。

完結,老夫雖不正經,但老夫一身的才華!關注我,獲取更多編程科技知識。

相關文章
相關標籤/搜索