在当今时代,互联网可以说是非常普及了。发展机遇造就了一大批科技巨头。他们利用互联网技术推出了大量科技产品。这些科技产品在给人们带来方便快捷生活的同时,也在慢慢改变着世界。在这场科技热潮的背景下,有无数的技术在提供支撑,众多的科技人才也在不断地开发和完善技术;在IT圈子里,有形形色色的从业者。他们凭借自己的实力,不断推进各种技术,使之趋于完美。正因为如此,他们活跃在各种技术社区和论坛中,不断讨论自己遇到的陷阱,争论哪种语言是最好的开发语言。所以就有了这个模因,“如果你想开始一场大辩论,那就去Java社区谈谈PHP是世界上最好的语言”。引发这个梗的不是别人,正是2001年php语言的官方文档:PHP是最好的web编程语言,那么其他语言呢?因为PHP是有史以来最好的语言。它速度快、功能强大且免费。所以,老实说,绝对与我无关。今天要分享的内容也和《PHP,世界上最好的语言》有关:是关于thinkphp的。提到thinkphp这个词,很多从事开发的小伙伴都不陌生,尤其是php语言领域的开发者;这是一个国人开发的php集成开发环境,目前在国内的php语言领域有很大的影响,我自己也有很多接触。使用一段时间后,感觉还不错。感兴趣的可以到官网下载试用。像这样的集成开发环境的优秀案例还有很多,比如:Laravel、Yii、CodeIgniter等,都值得一试。事情的由来那么,作为一个Java程序员,我为什么要来分享PHP的内容呢?原因其实很简单,公司需要,这个理由就够了。项目不是很大,功能也比较简单,所以前期开发测试比较顺利;但是当我完成项目的开发和部署的时候,我才意识到问题所在,因为开发和部署都是使用成熟的php集成环境,所以对PHP的整个运行过程不是很了解,总觉得自己'漂浮在空中;于是,我决定抛开集成环境,单独手动部署一个thinkphp运行环境。前期准备在WebServer和WebApplicationweb开发中,经常会提到webserver和webapplication这两个词。很多时候,很容易因为定义不当造成歧义。这里简单介绍一下:WebServer:即web服务器,通常是指Apache、Nginx、IIS、Lighttpd、Tomcat、Wildfly等软件;WebApplication:即Web应用程序,通常是指使用编程语言开发的项目程序;项目(web应用)开发完成后,需要进行编译。然后交给web服务器运行。技术方案的选择需要在正式开始环境部署之前做一些准备工作。俗话说,万事俱备,未趁风。通常,php的运行环境有多种成熟稳定的方案可供选择。下面是比较成熟的两个:PHP+Apache:以ISAPI方式运行PHP项目,选择PHP版本为TS(即线程安全版本);这种方式配置比较负责,配置过程容易因人为配置出错,但是这种方案的稳定性更高;PHP+Nginx:以FAST-CGI/PHP-FPM模式运行PHP项目,PHP版本选择NTS(即线程Insecure版本);这种方式配置少,对高并发、高负载性能较好,但稳定性不如Apache;我们这里选择后一种来敲定解决方案的细节,即:PHP+Nginx,所以php版本要选择nts版本,需要的软件如下:一台能正常运行的电脑,windows操作系统;nginx1.13+;提供php项目运行环境支持;thinkphp5+;PHP项目;php-nts-5.6;php语言支持,作为解释型语言,需要安装官方语言解释器来解释执行php代码;之所以选择nts版本是因为你选择了Nginx作为服务器;一个认真的程序员,这一点尤为重要;然后下载并解压2、3、4中的软件,等待使用。PHP的安装与配置我们这里选择的版本是php5.6。在下载php的时候,你会发现有不同的版本可以选择,如下图所示:PHP提供了nts版本和ts版本,分别是线程安全版和线程安全版。版本,两个版本有很大区别:ts版本:线程安全版本,在多线程访问时使用了一种锁机制,可以保证同一个数据或操作在同一个时间点只能被一个线程访问,从而避免多个线程同时操作一个数据导致的脏数据问题;但其性能较nts版本差,适用于对数据安全性要求比较高的场景。nts版本:thread-unsafe版本,多线程访问时不提供数据访问保护,有可能多个线程先后或同时操作同一个数据,造成数据混乱;但是nts版本性能更好,适用于对数据安全不是很重视,对性能要求更高的场景。本文选择nts版本,点击Zip下载PHP包,然后解压得到如下目录:php.exe:PHP执行工具,可以在CMD命令中执行命令php.exexxx.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-b127.0.0.1:9000-c"p??hp.ini";php-cgi在127.0.0.1:9000运行;php-cgi运行问题如果运行php-cgi命令时出现如下问题,说明系统缺少VisualC++RedistributablePackage,需要下载安装;问题解决1、下载VisualC++RedistributablePackage(下载地址:DownloadVisualC++RedistributablePackage);2、选择64位安装包;3、下载完成后,点击安装;4.返回cmd运行php-cgi,问题解决;FastCGI在网站的整体结构中,WebServer软件(如nginx、apache、httpd等)执行内容分发器,响应客户端的请求。对于静态资源请求,会在设置的路径下查找,然后返回,如果没有找到,会返回错误信息;对于动态请求,它们会将数据传递给相应的程序进行处理,然后返回程序处理的结果。CGICGI是WebServer和WebApplication之间进行数据交换的协议。它的全称是CommonGatewayInterface(CGI),可以实现浏览器和服务器之间的数据交互。CGI不是一种编程语言,也不属于任何一种语言,但大多数语言都提供对CGI的支持。CGI是一种将用户提交的数据转换为k-v字典的通信协议。CGI本身不负责传输数据,数据传输是由socket完成的。用户每发送一次CGI请求,WebServer软件就会生成一个新的CGI解释器进程(如php-cgi.exe),当CGI脚本处理完请求后,CGI解释器进程就会被Web释放服务器;这个过程被称为fork-and-execute模式。fork-and-execute模式在高并发场景下,由于CGI解释进程的重复创建和销毁,会消耗大量的服务器资源,导致服务器性能低下。为了解决这个问题,FastCGI应运而生。FastCGIFastCGI也是WebServer和WebApplication之间进行数据交换的协议。它是CGI的扩展版本,执行效率远高于CGI。FastCGI就像一个常驻(long-live)的CGI,可以一直执行,只要激活,每次fork都不会花时间。FastCGI也是一种与语言无关的CGI开放扩展,是一种可扩展的架构。CGI性能低下的主要原因是CGI解释器的重复加载。FastCGI的主要行为是将CGI解释器进程保存在内存中,由FastCGI进程管理。服务器是有调度的,这样可以提高运行性能。PHP-CGIPPHP-CGI是PHP实现的官方FastCGI管理器,但它只是一个CGI程序。它只能解析请求并返回结果,但不会管理流程。PHP-FPPMPHP-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可以实现Gracefulrestart。但是windows下不支持php-fpm。如果想体验一下,可以选择Linux环境。Nginx配置Nginx是一个轻量级的网络服务器、反向代理服务器和电子邮件(IMAP/POP3/SMTP)代理服务器。由Soyev开发,2004年开始开源。目录介绍模块介绍文件conf/nginx.conf是nginx的服务配置文件。在配置文件中,可以为nginx做很多灵活而强大的配置,比如网络基础配置、虚拟主机绑定、反向代理、负载均衡等。以下是一些主要模块:1.全局块 全局block是配置文件从头到events块的一部分。它主要设置了一些影响nginxserver整体运行的配置指令,所以这些指令的作用范围是整个nginxServer全局。这些配置指令包括:用户(组)、工作进程数、pid路径、日志路径等。2.Eventsblockeventsblock涉及的设置说明包括是否开启多worker进程下网络连接的序列化,是否允许同时接收多个网络连接,选择哪种事件驱动模型来处理连接要求。每个工作进程可以同时支持的最大连接数。3、httpblock httpblock在nginx配置中尤为重要。代理、缓存、日志定义、文件类型、网络基础配置、第三方模块的配置等大部分功能都可以放在这个模块中。具体包括文件导入、mime-type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、最大单次连接请求数等。4.服务器块 每个服务器块都是一个绑定的虚拟主机,是一组服务(或网站)。一个http中可以有多个服务器。每个服务器块可以包含多个位置块。 每个绑定网站的域名和端口都在server块配置,其他包括路由配置、接入设备判断等数据都是需要的。5.location块 用于配置请求的路由和各种页面的处理。每个server块可以包含多个location块,location是server块的一条指令,基于nginx服务器收到的请求字符串(例如:server_name或url_string),对于虚拟主机名(或ip)以外的字符字符串比如url_stirng是匹配处理特定请求的。地址定向、数据缓存、响应控制等功能都在这部分实现。这里的配置主要是应用相关的。运行命令在cmd中打开nginx根目录,就可以在nginx上执行运行命令;查看Nginx版本号:nginx-V配置检查:nginx-t启动nginx:启动nginx配置文件修改重新加载命令:nginx-sreloadfast停止或关闭Nginx:nginx-sstop正常停止或关闭Nginx:nginx-squitphp运行并配置nginx运行php项目需要fastcgi支持,所以需要在nginx中引入fastcgi配置;由于项目使用的是thinkphp,所以需要定位到项目中的public目录下;因此,完整的配置如下:1、在http模块中,在server块之前添加如下配置:2、server块的完整配置如下:3、nginx配置完成后,可以通过配置的域名和端口访问项;至此配置完成。总结要主动出击,不是语言选择人,而是人选择语言。坚持学习才是王道。如果有需要以上完整配置的小伙伴,可以私信我获取。完了,老头子虽然不正经,但是老头子却是才华横溢啊!关注我获取更多编程技术知识。
