php 工作模式

PHP运行模式

1.cgi通用网关接口 (少用)
2.fast-cgi常驻型的 cgi [ngixn常用]
3.cli命令运行 (命令行用得多)
4.web模块模式(apache等web服务器的运行模式)[apache常用]

1.cgi通用网关接口
是一段程序,通俗来说,像一座桥,把网页和web服务器中的执行程序连接起来,
它把html接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返
还给html页,cgi跨平台性能极佳,几乎可以在任何系统上实现。比较老的模式,
现好少在用了
每一个用户请求,都先会创建cgi子进程,然后处理请求,处理完后结束这个子进程,
这就是 fork-and-execute模式。当用户请求数量非常多时,会大量挤占系统的资源,
如内存,CPU时间等,造成效能低下,用CGI方式的服务器有多少连接请求,就会有
多少个cgi子进程,子进程反复加载是cgi性能低下的主要原因
此模式安装:
去掉注释:
LoadModule php5_module modules/libphp5.so 这行,如果不去,就是handler模式,也就是模块模式
接着在 httpd.conf增加 action:
Action application/x-httpd-php /cgi-bin/

2.Fastcgi模式
fast-cgi 是cgi的升级版本,FastCGI 像是一个常驻 (long-live) 型的 CGI,
它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次。
FastCGI的工作原理是:
(1)、Web Server启动时载入FastCGI进程管理器【PHP的FastCGI进程管理器是PHP-FPM(php-FastCGI Process Manager)】
(IIS ISAPI或Apache Module);

(2)、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)
并等待来自Web Server的连接。

(3)、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。
Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

(4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。
当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自
FastCGI进程管理器(运行在 WebServer中)的下一个连接。在正常的CGI模式中,
php-cgi.exe在此便退出了。

在CGI模式中,你可以想象 CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、
重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,
所有这些都只在进程启动时发生一次。一个额外的好处是,
持续数据库连接(Persistent database connection)可以工作。

Fastcgi的优点:
1)从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,
系统可以很轻易的丢弃,然后重新分 配新的进程来运行逻辑.

2)从安全性上看,Fastcgi支持分布式运算. fastcgi和宿主的server完全独立,
fastcgi怎么down也不会把server搞垮.

3)从性能上看, fastcgi把动态逻辑的处理从server中分离出来,
大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,
对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态

用FastCGI模式更适合生产环境的服务器。

3.cli命令模式
在linux中,经常用的 php xx.php即为该模式

4.模块模式:
模块模式是以mod_php5模块的形式集成,此时mod_php5模块的作用是接收Apache
传递过来的PHP文件请求,并处理这些请求,然后将处理后的结果返回给Apache。
如果我们在Apache启动前在其配置文件中配置好了PHP模块(mod_php5),
PHP模块通过注册apache2的ap_hook_post_config挂钩,在Apache启动的时候启动此模块
以接受PHP文件的请求。
除了这种启动时的加载方式,Apache的模块可以在运行的时候动态装载,这意味着对服务器可以进行功能扩展
而不需要重新对源代码进行编译,甚至根本不需要停止服务器。我们所需要做的仅仅是给服务器发送信号HUP
或者AP_SIG_GRACEFUL通知服务器重新载入模块。但是在动态加载之前,我们需要将模块编译成为动态链接库。
此时的动态加载就是加载动态链接库。 Apache中对动态链接库的处理是通过模块mod_so来完成的,
因此mod_so模块不能被动态加载,它只能被静态编译进Apache的核心。这意味着它是随着Apache一起启动的。

Apache是如何加载模块的呢?我们以前面提到的mod_php5模块为例。
首先我们需要在Apache的配置文件httpd.conf中添加一行
该运行模式是我们以前在windows环境下使用apache服务器经常使用的,而在模块化(DLL)中,
PHP是与Web服务器一起启动并运行的。
(是apache在CGI的基础上进行的一种扩展,加快PHP的运行效率)

LoadModule php5_module modules/mod_php5.so

这里我们使用了LoadModule命令,该命令的第一个参数是模块的名称,名称可以在模块实现的源码中找到。
第二个选项是该模块所处的路径。如果需要在服务器运行时加载模块,可以通过发送信号HUP
或者AP_SIG_GRACEFUL给服务器,一旦接受到该信号,Apache将重新装载模块,而不需要重新启动服务器。

php在Nginx中运行模式(Nginx+ PHP-FPM)
使用FastCGI方式现在常见的有两种stack:
ligthttpd+spawn-fcgi;另外一种是nginx+PHP-FPM(也可以用spawn-fcgi)。

A、如上面所说该两种结构都采用FastCGI对PHP支持,因此HTTPServer完全解放出来,
可以更好地进行响应和并发处理。因此lighttpd和nginx都有small, but powerful和efficient的美誉。

B、该两者还可以分出一个好坏来,spawn-fcgi由于是lighttpd的一部分,
因此安装了lighttpd一般就会使用spawn-fcgi对php支持,
但是目前有用户说ligttpd的spwan-fcgi在高并发访问的时候
,会出现上面说的内存泄漏甚至自动重启fastcgi。即:PHP脚本处理器当机,
这个时候如果用户访问的话,可能就会出现白页(即PHP不能被解析或者出错)。

另一个:首先nginx不像lighttpd本身含带了fastcgi(spawn-fcgi),
因此它完全是轻量级的,必须借助第三方的FastCGI处理器才可以对PHP进行解析,
因此其实这样看来nginx是非常灵活的,它可以和任何第三方提供
解析的处理器实现连接从而实现对PHP的解析(在nginx.conf中很容易设置)。
nginx可以使用spwan-fcgi,但是由于spawn-fcgi具有上面所述的用户逐渐发现的缺陷,
现在慢慢减少使用nginx+spawn-fcgi组合了。

C、由于spawn-fcgi的缺陷,现在出现了新的第三方的PHP的FastCGI处理器,叫做PHP-FPM。
它和spawn-fcgi比较起来有如下优点:

由于它是作为PHP的patch补丁来开发的,安装的时候需要和php源码一起编译,
也就是说编译到php core中了,因此在性能方面要优秀一些。
同时它在处理高并发方面也优于spawn-fcgi,至少不会自动重启fastcgi处理器。
因此,如上所说由于nginx的轻量和灵活性,因此目前性能优越,
越来越多人逐渐使用这个组合:nginx+PHP/PHP-FPM

目前在

HTTPServer这块基本可以看到有三种stack比较流行:
(1)Apache+mod_php5

(2)lighttp+spawn-fcgi

(3)nginx+PHP-FPM

三者后两者性能可能稍优,但是Apache由于有丰富的模块和功能,目前来说仍旧是老大。有人测试nginx+PHP-FPM在高并发情况下可能会达到Apache+mod_php5的5~10倍,现在nginx+PHP-FPM使用的人越来越多。

时间: 2024-11-12 03:40:10

php 工作模式的相关文章

apache 工作模式

我主要来说一下prefork和worker工作模式.      prefork的工作原理 如果不用"--with-mpm"显式指定 某种MPM,prefork就是Unix平台上缺省的MPM.它所采用的预派生子进程方式也是Apache1.3中采用的模式.prefork本身并没有 使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为 最稳定的MPM之一. prefork的工作原理是,控制进程在最 初

ARM处理器工作模式

++++++++++++++++++++++++++++++++++++++++++ 本文转载自mr_raptor的专栏,感谢mr_raptor大神. http://blog.csdn.net/mr_raptor/article/details/6556157 ++++++++++++++++++++++++++++++++++++++++++ 1.1 ARM处理器工作模式 CPU的模式可以简单的理解为当前CPU的工作状态,比如:当前操作系统正在执行用户程序,那么当前CPU工作在用户模式,这时网

apache几种工作模式对比

 apache2主要的优势就是对多处理器的支持更好,在编译时同过使用--with-mpm选项来决定apache2的工作模式.如果知道当前的apache2使用什么工作机制,可以通过httpd -l命令列出apache的所有模块,就可以知道其工作方式: prefork:如果httpd -l列出prefork.c,则需要对下面的段进行配置: <IfModule prefork.c> StartServers 5 #启动apache时启动的httpd进程个数. MinSpareServers 5

Apache的三种工作模式

Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式. 它们分别是prefork,worker和event,它们同时也代表这Apache的演变和发展. 如何查看我们的Apache的工作模式呢?可以使用httpd -V 命令查看,如我安装的Apache 2.4版本. $ /usr/local/apache24/bin/httpd -V Server version: Apache/2.4.18 (Unix) Server buil

apache工作模式介绍

apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式 . prefork模式:这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求. 这个MPM具有很强的自我调节能力,只需要很少的配置指令调整.最重要的是将M

Apache 的工作模式

1.apache三种工作模式我们都知道Apache有三种工作模块,分别为prefork.worker.event.    prefork:多进程,每个请求用一个进程响应,这个过程会用到select机制来通知.    worker:多线程,一个进程可以生成多个线程,每个线程响应一个请求,但通知机制还是select不过可以接受更多的请求.    event:基于异步I/O模型,一个进程或线程,每个进程或线程响应多个用户请求,它是基于事件驱动(也就是epoll机制)实现的. 2.prefork的工作原

ASP.NET Mvc实用框架(一)Ioc、仓储模式和单元工作模式

Framework.EF 首先看一下这个类库: Extended文件夹存放的是EntityFramework.Extensions这个插件的源代码,没有别的原因,就是本人觉得这个插件挺好的,每次省的下载而已 IDependency:用于依赖注入的接口 IRepository和Repository:用于仓储模式 IUnitOfWork和UnitOfWork:用于单元工作模式 Page:分页实体 1.什么是依赖注入? 记得第一次接触依赖注入的时候是在我大二暑假自己出去实习的时候,当时带我的人让我看一

VMware虚拟机三种工作模式

工作模式 VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,就应该先了解一下这三种工作模式. bridged(桥接模式) 在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器.在桥接模式下,你需要手工为虚拟系统配置IP地址.子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信.同时,由于这个虚拟系统是局域网中的一

(8)MSP430F5529 系统工作模式

第四章我们提到可以从电源层入手,达到从源头上控制功耗的目的.这一章   我们就会讲CPU工作模式,如何从次一级来控制功耗. 不同工作模式下,CPU会禁用一些模块,从而达到控制功耗的目的. (PS:同样那句话,“功耗太远”,一般都不会去更改工作模式,所以简单学习) 简介几句话: ①改变工作模式会立即生效: ②发生中断时,当前的模式设置信息会被保存,以便恢复(除非中断服务程序中改变了工作模式): ③处于LPM4.5模式时,PMM的电源监管不会生效,所有的RAM和寄存器都会丢失,但是I/O口状态会锁定

串行工作模式之同步移位寄存器的输入输出方式

主要用于扩展并行输入或输出口.数据有RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出.发送和接受均为8位数据.低位在前,高位在后. //串行口工作模式0 #include <reg52.h> #define uchar unsigned char #define uint unsigned int void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void