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使用的人越来越多。

php 工作模式的更多相关文章

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

    Framework.EF 首先看一下这个类库: Extended文件夹存放的是EntityFramework.Extensions这个插件的源代码,没有别的原因,就是本人觉得这个插件挺好的,每次省的下 ...

  2. 实战Java虚拟机之二“虚拟机的工作模式”

    今天开始实战Java虚拟机之二:“虚拟机的工作模式”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...

  3. 2.2 ARM处理器工作模式

    ARM Architecture Reference Manual Arm 指令框架手册 种工作模式 Processor mode Mode number Description User usr 0 ...

  4. apache 的工作模式

    总结:访问量大的时候使用 worker模式:  每个进程,启动多个线程来处理请求,每个线程处理一次请求,对内存要求比较高. prefoek模式 : 每个子进程只有一个线程,一次请求一个进程. 什么是a ...

  5. Apache常用2种工作模式prefork和worker比较

    Apache两种常用工作模式:prefork和worker. prefork MPM prefork是一个非线程型的.预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高, ...

  6. apache查看工作模式及调优

    一,查看工作模式 /usr/sbin/httpd -l Compiled in modules:  core.c  prefork.c  http_core.c  mod_so.c 如果出现prefo ...

  7. apache工作模式:prefork和worker

    apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式 一.两种模式 prefork模式: prefork是 ...

  8. (转载)关于Apache 的两种工作模式

    今天在查看服务器的时候,发现服务器http请求数 每天增长越来越多,在优化集群服务器的时候,查看到Apache 的工作模式是prefork,于是想到了worker 模式, 想暂时的把当前运行模式改成w ...

  9. VMWare提供了三种工作模式上网

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...

  10. ARM工作模式

    ARM工作模式 学习ARM的最好的资料是ARM公司发布的资料:ARM Architecture Reference Manual.pdf 找到章节:Programmers’ Model 由文档可知:A ...

随机推荐

  1. C++ 继承的访问权限

    1.它解决什么问题?为什么设计出继承的各种访问权限? 可以这样认为,C++继承会把父类的东西拉到自己这里,这些东西都是自己的,父类中的字段和方法都有访问权限,如果我想改变这些东西的访问权限,该怎么办? ...

  2. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] C. Weakness and Poorness 三分 dp

    C. Weakness and Poorness Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...

  3. MST最小生成树及克鲁斯卡尔(Kruskal)算法

    最小生成树MST,英文名如何拼写已忘,应该是min spaning tree吧.假设一个无向连通图有n个节点,那么它的生成树就是包括这n个节点的无环连通图,无环即形成树.最小生成树是对边上权重的考虑, ...

  4. protocol buffer的简单使用

    protocol buffer是一个高效的结构化数据存储格式,用来结构化数据的序列化与反序列化.目前支持java.c++.Python 相对于json而言: 数据量跟小 其他的还没看出什么优势 下载地 ...

  5. [MODx] 9. Real Example

    Snippet code: <?php $path = MODX_CORE_PATH . 'components/storefinder/'; $result = $modx->addPa ...

  6. Linux 基础 —— RPM

    http://liaoph.com/linux-rpm/ 这篇文章主要讲 RPM 软件包管理器的使用. 软件包的演变史 最早期时,软件包是一些可以运行的程序组成的集合,可能还要加上若干配置文件和动态库 ...

  7. PAT 1006

    1006. Sign In and Sign Out (25) At the beginning of every day, the first person who signs in the com ...

  8. C#_数据库基本交互

    //app.config <?xml version="1.0" encoding="utf-8" ?> <configuration> ...

  9. if elseif else

    1)if,else if需要接判断表达式,只有在满足条件的时候执行而else语句是在前面条件都不满足的时候才能执行(2) 一个if...else if...else语句中可以有多个else if语句, ...

  10. A+B Problem III

    描述 求A+B是否与C相等. 输入 T组测试数据. 每组数据中有三个实数A,B,C(-10000.0<=A,B<=10000.0,-20000.0<=C<=20000.0) 数 ...