在现在这个时代,互联网可谓是大行其道,由互联网带动的各行各业蓬勃发展,也正是因为及时抓住的互联网带来的发展机遇,成就了一大批科技巨头,他们利用互联网技术推出了一大批科技产品,这些科技产品在给人们带来方便、快捷的生活的同时,也在慢慢改变着世界。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
配置完成,便可经过配置的域名和端口访问项目;至此配置完成。
主动出击,不是语言选择人,是人选择语言。坚持学习才是王道。若是有小伙伴须要以上完整配置的,能够私信我获取。
完结,老夫虽不正经,但老夫一身的才华!关注我,获取更多编程科技知识。