Home >Backend Development >PHP Tutorial >既然apache也是调php解析器php-cgi.exe去执行php的,为啥一定要安装apache呢?
既然apache也是调php解析器php-cgi.exe去执行php的,为啥一定要安装apache呢?
为啥不是直接把请求给php-cgi.exe, 还要经过apache绕一下?
既然apache也是调php解析器php-cgi.exe去执行php的,为啥一定要安装apache呢?
为啥不是直接把请求给php-cgi.exe, 还要经过apache绕一下?
一个php的地址请求的时序图是这样的,php-cgi是和apache之间进行fastcgi通信的监守程序,是不能被去掉的。
当然apache还有一种不通过fastcgi进行调用php的方式,即apache模块方式:
<code>LoadModule php5_module /usr/lib/apache/libphp5.so </code>
这个时候时序图上是没有php-cgi这个实体的,apache直接调用php.
apache实现了http协议及相关内容,而php只是可以作为它的一个扩展而已
如果你用php实现http协议相关内容,也可以无需apache的。
当然你也可以这样:
<code>php -S 0.0.0.0:8080 -t /www </code>
直接用php内置的web server,无需安装apache。
PHP作为Apache的一个module(libphp5.so)集成到Apache进程(httpd)运行,这种mod_php的运行模式是最常用的,这时PHP的运行跟php-cgi没有任何关系.mod_php的配置是这样:
<code>LoadModule php5_module modules/libphp5.so AddHandler application/x-httpd-php .php </code>
可以配置extra/httpd-mpm.conf来控制Apache的进程数量.
如果你在Apache里用mod_fcgid方式来运行PHP,则需要使用php-cgi,这时Apache作为有一个FastCGI进程管理器来管理php-cgi,在httpd.conf配置:
<code>#载入mod_fcgid模块(不能和php5_module同时使用) LoadModule fcgid_module modules/mod_fcgid.so AddHandler fcgid-script .php #php-cgi的进程数量 FcgidMaxProcesses 5 #指定php-cgi来处理php请求 FcgidWrapper /png/php/5.4.39NTS/bin/php-cgi .php #在需要使用php-cgi来执行PHP的Directory加上Options +ExecCGI,比如: <directory> Options +ExecCGI </directory> </code>
另外在Linux上还有一种非常常用的组合,就是Nginx搭配php-fpm使用,其中php-fpm跟php-cgi没有任何关系,php-fpm自身就集成了PHP解释器,php-fpm有自己的进程管理器,只处理Nginx转发过来的PHP请求并返回,跟Nginx是松耦合的.
php-cgi.exe不是http服务器,它接受的协议和apache完全不一样。如果需要去掉apache就必须用php实现http协议,会导致很多无用代码还可能有bug。
一个网站的构成,除了php生成的动态内容之外,还有其它的部分,比如静态内容,如果由php去下发这些静态内容的话,效率自然不如专门为这种工作优化过的web server来得高效。
除了静态内容之外,还有记录访问日志、url rewrite、http协议相关的很多东西,假设世界上没有web server这种东西,那我们无论使用什么语言来开发网站,都必须把这些东西写一遍。把这些东西独立出来,实现成为web server,就节约了大量的重复性劳动,而且无论后端使用任何语言,都可以直接通过部署到web server享受到这些便利。这一点其实跟我们在设计系统的时候把某些逻辑专门抽象封装出来是一个道理。
别的不说,后端直接暴露在公网你还真敢干啊。。