本话题来自于我使用PHP进行网页爬虫的一次经历。对于一个web开发者来讲,PHP解释器自己却知之甚小,实在是惭愧呐!php
首先这个话题要从几个提问开始。html
外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”,是一种通用开源脚本语言。node
所谓超文本预处理器本意是在HTML等这样的文本发送给浏览器前先进行服务器端的处理,从而实现动态发送本来静态的文件。PHP创始人本意是为了提供动态网页开发的便捷性,为web开发提供了预处理模块,因此说早期的PHP更像是一款web开发工具集,后来PHP开发变得庞大,独立成为一个解释器,并有了本身的语言规范。python
知道起源的缘由是须要咱们明白一点:PHP是为web开发而生,但后来他太强了独立成了新语言!nginx
故而PHP最原始的思想是与web服务器进行精密的结合,那么如何将语言和服务器软件结合?这就引起下面的问题了。web
诸如:Nginx,apache,IIS,tomcat,还有一些语言内置诸如nodejs,能提供web功能的软件,实现http协议的服务软件都称为web软件,安装了这些软件的服务器就叫作web服务器。(web与http关系就是,web是一个创建在http协议上的软件集合,web软件是一种实现,http只是一种协议)。web软件最基础的功能是request,response,也就是能处理用户的请求和响应他们。因此PHP,Python,ruby什么的语言自己与他们没有半毛钱的关系。算法
php_modapache
提到PHP如何在apache的服务器上跑起来,就得提到apache下的一个模块,php_mod,就是这个模块让PHP解释器成为apache的一个子进程,子模块,让apache能够建立调用PHP进程,从而实现了所谓的LAMP,WAMP架构。编程
这种状况下php和apache是一种从属关系,apache启动时须要加载php模块,读取php.ini文件,一个最明显的特色是:在CGI模式下修改php.ini后不须要重启web服务器,而php_mod模式下修改php.ini则须要重启apache。网页爬虫
fast-cgi
提到nginx如何跑php,就不得不提到fast-cgi,要说fast-cgi就得说cgi是个什么东西。
cgi:协议,web软件和脚本语言之间通讯的规范,目的就是让web软件可以规范调用那些脚本语言,诸如php,python,js等的解释器。
fast-cgi:实现,fast-cgi就是cgi的一种实现,Nginx用的就是这种实现,因此Nginx能够和php进行“通讯”。
Nginx这种cgi模式与apache最大区别就是,php与nginx两个软件互相独立运行,Nginx须要执行php文件就交给php-fpm去作,处理完结果按照cgi规范返回给Nginx,Nginx处理完发送给用户。
除此之外,fast-cgi在cgi原有规范上还作了改进,cgi本来的规定是每个请求都建立一个新的进程或者线程,结束后关闭,这样最大缺点是一开一关很消耗性能。因而fast-cgi的作法是在web服务器同时也启动一个进程,并预先启动子进程,线程,放在进程池中等待web请求过来,这样nginx一旦有请求过来,就能立马进行处理,再也不一开一关进程了,这样效率,性能获得显著的提高。
正是由于cgi只是一个通讯协议,它还支持分布式的运算,即fast-cgi程序能够在网站服务器之外的主机上执行而且接受来自其余网站服务器的请求。
FastCGI整个流程:
php-fpm
php-fpm是php的fast-cgi的进程管理器。
php-cli
早就说过,如今的php已是一门独立的脚本语言,因此php提供了cli编程,GUI编程,还保留了最重要的web编程。php-cli实际就是一个语言解释器,若是使用php只是进行爬虫,算法开发,只须要安装php-cli便可,什么cgi,fpm都不须要了,在windows下称做php.exe,只要有了cli,直接就能够在cmd下解析php文件了。
不少人用多了apache,nginx,并不知道php和nodejs同样,自带了webserver模块,能够直接经过php启动80端口监听的webserver。
以下:
php -S 127.0.0.1:8080 -t /var/www/html/