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.
所以,跟我绝对没关系,说真的。
事情的缘起
那么,我作为一个 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应用程序,通常指的是使用编程语言开发的项目程序;
技术方案的选择
在正式开始环境部署前,需要做一些准备工作,正所谓借东风之前,不得先万事俱备嘛。通常 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 的时候,会发现有不同的版本可选择,如下图所示:![8561501d1ba4404eb5bf45cf6393bf63.png](https://i-blog.csdnimg.cn/blog_migrate/eb990a0c24d8099972edd895dc90d852.jpeg)
ts版:即线程安全版,其在多线程访问时,采用了加锁机制,能够保证同一个数据或者操作同一个时间点只能被一个线程访问操作,从而避免多个线程同时操作一个数据导致的脏数据问题;但其在性能上要比nts版差一些,适用于对数据安全要求比较高的场景。
nts版:即线程不安全版,在多线程访问时不提供数据访问保护,有可能出现多个线程先后或同时操作同一数据的情况,从而可能造成数据错乱;但nts版却有着更好的性能,适用于不太注重数据安全,需要更好性能的场景。
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 ,需要下载安装;![5e69ee708065d57d71b971ccfd185bb2.png](https://i-blog.csdnimg.cn/blog_migrate/4a323e1e0dbed714c53cf09e31c5b98e.jpeg)
问题的解决
1. 下载Visual C++ Redistributable Package,下载地址如下:
http://www.microsoft.com/zh-CN/download/details.aspx?id=30679
2. 选择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 年开源公开。目录介绍
模块介绍
文件 conf/nginx.conf 是 nginx 的服务配置文件,在配置文件中可以对 nginx 做网络基础配置、虚拟主机绑定、反向代理,负载均衡等众多灵活、强大的配置,以下是一些主要的模块:1. 全局块
全局块是配置文件从开始到events块之间的一部份内容,主要设置一些影响nginx服务器整体运行的配置指令,因此这些指令作用域是整个nginx服务器全局。这些配置指令包括:用户(组)、worker process数、pid路径、日志路径等。
2. events块
events 块涉及的设置指令包括是否开启对多 worker process 下的网络连接进行 序列化 ,是否允许同时接收 多个网络连接 ,选取哪种 事件驱动模型 处理连接请求,每个 worker process 可以同时支持的 最大连接数。![8730a57e2ccb0287a169426db7905974.png](https://i-blog.csdnimg.cn/blog_migrate/08630bd4a8ce4c4e71c65ad89a7f02ea.jpeg)
3. http块
http 块在 nginx 配置中尤为重要,代理、缓存、日志定义、文件类型,网络基础配置等绝大多数的功能和第三方模块的配置都可以放在这个模块中。具体包括文件引入、 mime-type 定义、日志自定义、是否使用 sendfile 转输文件、连接超时时间、单连接请求数上限等。![1dd7db2d4df788bfeb02c561129d0695.png](https://i-blog.csdnimg.cn/blog_migrate/57da1886122b40c7f8b5473cc47616f2.jpeg)
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块之前加入如下的配置:
![7fe666cfed3de41583d5d4a74df4da5b.png](https://i-blog.csdnimg.cn/blog_migrate/00a6d7ec99cb9ca1107fe3f9131b4ea0.jpeg)
2.server块完整配置如下:
3.nginx配置完成,即可通过配置的域名和端口访问项目;至此配置完成。
小结
主动出击,不是语言选择人,是人选择语言。坚持学习才是王道。如果有小伙伴需要以上完整配置的,可以私信我获取。完结,老夫虽不正经,但老夫一身的才华!关注我,获取更多编程科技知识。