在这科技大繁荣的背景之下,有着无数的技能在供应支持,更有浩瀚的科技人才在不断发展和完善技能;在IT这个大圈儿中,有着各式各样的从业者,他们在用自己的实力在不断推进各种技能,使之不断完善,也正由于如此,他们生动在各个技能社区、论坛不断谈论着碰着的坑、辩论着哪个措辞才是最好的开拓措辞。
以是便有了这样的梗,“如果你想引发一场大型辩论,那就去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.
以是,跟我绝对没紧要,说真的。
利用Nginx支配Thinkphp运行环境
本日要分享的内容也和“天下最好的措辞 PHP”有关:是关于thinphp的,
提到thinkphp这个词,很多从事开拓的小伙伴都不会陌生,特殊php措辞领域的开拓者们;这是一款国人开拓的php集成开拓环境,目前在中国的php措辞领域有着不小的影响力,我自己也有不少的打仗,经由一段韶光的利用下来,觉得还不错。如果有感兴趣的的同好们,可以辞官网下载来考试测验一番。
类似这样的集成开拓环境还有也有很多精良的案例,比如:Laravel 、Yii、CodeIgniter等,都是值得一试的。
事情的缘起
那么,我作为一个Java 程序员,为什么会来分享PHP的内容呢?缘故原由实在很大略,公司须要,这个情由足矣。项目也不是很大,功能也比较大略,以是前期的开拓、测试都比较顺利;但当我把项目开拓完成并支配完毕后,我意识到了问题,由于开拓和支配都是利用的成熟的php集成环境,以是我对付PHP 的全体运行过程并不理解,总有一种飘在空中的觉得;以是,我决定,抛开集成环境,独自手动支配一个thinkphp的运行环境。
前期准备
Web Server 和 Web Application
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作为做事器;正经程序员一枚,这个尤为主要;然后将2、3、4中的软件下载、解压,等待利用。
PHP 安装配置
这里我们选择的版本是php 5.6,不才载php的时候,会创造有不同的版本可选择,如下图所示:
php 版本选择
PHP 供应了nts版和ts版,分别是线程安全不版本和线程安全版本,两个版本有着很大的不同:
ts版:即线程安全版,其在多线程访问时,采取了加锁机制,能够担保同一个数据或者操作同一个韶光点只能被一个线程访问操作,从而避免多个线程同时操作一个数据导致的脏数据问题;但其在性能上要比nts版差一些,适用于对数据安全哀求比较高的场景。nts版:即线程不屈安版,在多线程访问时不供应数据访问保护,有可能涌现多个线程先后或同时操作同一数据的情形,从而可能造成数据错乱;但nts版却有着更好的性能,适用于不太看重数据安全,须要更好性能的场景。本文选择nts版,点击Zip下载PHP程序包,然后解压,得到如下的目录:
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运行问题
若是在运行php-cgi命令时涌现以下的问题,则解释系统短缺Visual C++ Redistributable Package,须要下载安装;
MSVCR110.dll文件的缺失落
问题的办理
1. 下载Visual C++ Redistributable Package(下载链接会在评论区给出);
下载Visual C++ Redistributable Packa
2. 选择64位的安装包;
选择64位的安装包
3. 下载完成后点击安装即可;
4. 重新回到cmd中运行php-cgi,问题已办理;
FastCGI
在网站的整体架构中,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 配置Nginx是一款轻量级的Web 做事器、反向代理做事器、电子邮件(IMAP/POP3/SMTP)代理做事器,运行时霸占内存少,并发能力强;是由俄罗斯程序员伊戈尔·赛索耶夫开拓的,自2004年开源公开。
目录先容
nginx 目录先容
模块先容
文件conf/nginx.conf是nginx的做事配置文件,在配置文件中可以对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块,location是server块的一个指令,基于nginx做事器吸收到的要求字符串(例如:server_name 或 url_string),对除虚拟主机名称(或ip) 之外的字符串如url_stirng进行匹配,对特定的要求进行处理。地址定向、数据缓存、和应答掌握等功能都是在这部分实现。
这里的配置多与运用程序干系。
location块
运行命令
在cmd中打开nginx根目录,即可对nginx实行运行命令;
运行nginx:start nginx停滞nginx:nginx -s reload配置检讨:nginx -tphp 运行配置
nginx 运行php项目须要fastcgi的支持,因此须要在nginx中引入fastcgi的配置;由于项目是利用thinkphp的,因此须要定位到项目中的public目录下;以是,完全的配置如下:
1.在http模块中,server块之前加入如下的配置:
fastcgi 配置
2.server块完全配置如下:
server 块配置
3.nginx配置完成,即可通过配置的域名和端口访问项目;至此配置完成。
小结主动出击,不是措辞选择人,是人选择措辞。坚持学习才是王道。如果有小伙伴须要以上完全配置的,可以私信我获取。
完结。老夫虽不正经,但老夫一身的才华