- 浏览: 399760 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
goahead2010:
有用
JS遍历对象或者数组 -
bishibaodian:
不要在这样找笔试题了,一次就这么几个,还没过瘾就没有了,去安装 ...
整理了一份招PHP高级工程师的面试题 -
smallearth:
不错
整理了一份招PHP高级工程师的面试题 -
ipodao:
暂时没发现啊!
IE域名带有下划线导致的session丢失 -
ipodao:
谢了
JS遍历对象或者数组
http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/
PHP的工作模型非常特殊。从某种程度上说,PHP和ASP、ASP.NET、JSP/Servlet等流行的Web技术,有着本质上的区别。
以Java为例,Java在Web应用领域,有两种技术:Java Servlet和JSP(Java Server Page)。Java Servlet是一种特殊类型的Java程序,它通过实现相关接口,处理Web服务器发送过来的请求,完成相应的工作。JSP在形式上是一种类似于PHP的脚本,但是事实上,它最后也被编译成Servlet。也就是说,在Java解决方案中,JSP和Servlet是作为独立的Java应用程序执行的,它们在初始化之后就驻留内存,通过特定的接口和Web服务器通信,完成相应工作。除非被显式地重启,否则它们不会终止。因此,可以在JSP和Servlet中使用各种缓存技术,例如数据库连接池。
ASP.NET的机制与此类似。至于ASP,虽然也是一种解释型语言,但是仍然提供了Application对象来存放应用程序级的全局变量,它依托于ASP解释器在IIS中驻留的进程,在整个应用程序的生命期有效。
PHP却完全不是这样。作为一种纯解释型语言,PHP脚本在每次被解释时进行初始化,在解释完毕后终止运行。这种运行是互相独立的,每一次请求都会创建一个单独的进程或线程,来解释相应的页面文件。页面创建的变量和其他对象,都只在当前的页面内部可见,无法跨越页面访问。在终止运行后,页面中申请的、没有被代码显式释放的外部资源,包括内存、数据库连接、文件句柄、Socket连接等,都会被强行释放。
也就是说,PHP无法在语言级别直接访问跨越页面的变量,也无法创建驻留内存的对象。见下例:
<?php class StaticVarTester { public static $StaticVar = 0; } function TestStaticVar() { StaticVarTester :: $StaticVar += 1; echo "StaticVarTester :: StaticVar = " . StaticVarTester :: $StaticVar; } TestStaticVar(); echo "<br/>"; TestStaticVar(); ?>
在这个例子中,定义了一个名为StaticVarTester的类,它仅有一个公共的静态成员$StaticVar,并被初始化为0。然后,在TestStaticVar()函数中,对StaticVarTester :: $StaticVar进行累加操作,并将它打印输出。
熟悉Java或C++的开发者对这个例子应该并不陌生。$StaticVar作为StaticVarTester类的一个静态成员,只在类被装载时进行初始化,无论StaticVarTester类被实例化多少次,$StaticVar都只存在一个实例,而且不会被多次初始化。因此,当第一次调用TestStaticVar()函数时,$StaticVar进行了累加操作,值为1,并被保存。第二次调用TestStaticVar()函数,$StaticVar的值为2。
打印出来的结果和我们预料的一样:
StaticVarTester :: StaticVar = 1
StaticVarTester :: StaticVar = 2
但是,当浏览器刷新页面,再次执行这段代码时,不同的情况出现了。在Java或C++里面,$StaticVar的值会被保存并一直累加下去,我们将会看到如下的结果:
StaticVarTester :: StaticVar = 3
StaticVarTester :: StaticVar = 4
…
但是在PHP中,由于上文叙及的机制,当前页面每次都解释时,都会执行一次程序初始化和终止的过程。也就是说,每次访问时,StaticVarTester都会被重新装载,而下列这行语句
public static $StaticVar = 0;
也会被重复执行。当页面执行完成后,所有的内存空间都会被回收,$StaticVar这个变量(连同整个StaticVarTester类)也就不复存在。因此,无论刷新页面多少次,$StaticVar变量都会回到起点:先被初始化为0,然后在TestStaticVar()函数调用中被累加。所以,我们看到的结果永远是这个:
StaticVarTester :: StaticVar = 1
StaticVarTester :: StaticVar = 2
PHP这种独特的工作模型的优势在于,基本上解决了令人头疼的资源泄漏问题。Web应用的特点是大量的、短时间的并发处理,对各种资源的申请和释放工作非常频繁,很容易导致泄漏。同时,大量的动态html脚本的存在,使得追踪和调试的工作都非常困难。PHP的运行机制,以一种非常简单的方式避免了这个问题,同时也避免了将程序员带入到繁琐的缓冲池和同步等问题中去。在实践中,基于PHP的应用往往比基于Java或.NET的应用更加稳定,不会出现由于某个页面的BUG而导致整个站点崩溃的问题。(相比之下,Java或.NET应用可能因为缓冲池崩溃或其他的非法操作,而导致整个站点崩溃。)后果是,即使PHP程序员水平不高,也无法写出使整个应用崩溃的代码。PHP脚本可以一次调用极多的资源,从而导致页面执行极为缓慢,但是执行完毕后所有的资源都会被释放,应用仍然不会崩溃。甚至即使执行了一个死循环,也会在30秒(默认时间)后因为超时而中止。从理论上来说,基于PHP的应用是不太可能崩溃的,因为它的运行机制决定它不存在常规的崩溃这个问题。在实践中,很多开发者也认为PHP是最稳定的Web应用。
但是,这种机制的缺点也非常明显。最直接的后果是,PHP在语言级别无法实现跨页面的缓冲机制。这种缓冲机制缺失造成的影响,可以分成两个方面:
一是对象的缓冲。如我们所知,很多设计模式都依赖于对象的缓冲机制,对于需要频繁应付大量并发的服务端软件更是如此。因此,对象缓冲的缺失,理论上会极大地降低速度。但是,由于PHP本身的定位和工作机制等原因,它在实际工作中的速度非常快。就作者自己的经验来看,在小型的Web应用中,PHP至少不比Java慢。在大型的应用中,为了榨干每一分硬件资源,即使PHP本身足够快,一个优秀的对象缓冲机制仍然是必要的。在这种情况下,可以使用第三方的内存缓冲软件,如Memcached。由于Memcached本身的优异特性(高性能,支持跨服务器的分布式存储,和PHP的无缝集成等),在大型的PHP应用中,Memcached几乎已经成为不可或缺的基础设施了。比起使用PHP语言自己实现对象缓冲来,这种第三方解决方案似乎更好一些。
二是数据库连接的缓冲。对MySQL,PHP提供了一种内置的数据库缓冲机制,使用起来非常简单,程序员需要做的只是用mysql_pconnect()代替mysql_connect()来打开数据库而已。PHP会自动回收被废弃的数据库连接,以供重复使用。具有讽刺意味的是,在实际应用中,这种持久性数据库连接往往会导致数据库连接的伪泄漏现象:在某个时间,并发的数据库连接过多,超过了MySQL的最大连接数,从而导致新的进程无法连接数据库。但是过一段时间,当并发数减少时,PHP会释放掉一些连接,网站又会恢复正常。出现这种现象的原因是,当使用pconnect时,Apache的httpd进程会不释放connect,而当Apache的httpd进程数超过了mysql的最大连接数时,就会出现无法连接的情况。因此,需要小心地调整Apache和Mysql的配置,以使Apache的httpd进程数不会超出MySQL的最大连接数。在某些情况下,一些有经验的PHP程序员宁可继续使用mysql_connect(),而不是mysql_pconnect()。
就作者所知,在PHP未来的roadmap中,对于工作模型这一部分,没有根本性的变动。这是PHP的缺点,也是PHP的优势,从本质上说,这就是PHP的独特之处。因此,我们很难期待PHP在近期内会对这一问题做出重大的改变。但是,在对待这个问题带来的一系列后果时,我们必须谨慎应对。
PHP 有两种工作模式:一种是CGI,一种是模块模式
一个是使用exe,一个是使用dll。使用模块,效率比较高
PHP 在Apache中两种工作方式: CGI模式、Apache模块dll
1.CGI方式 PHP在Apache 2.x 中的CGI方式
# 对 PHP 5 用这行
Action application/x-httpd-php “/php/php-cgi.exe”
2. Apache Module方式
# 对 PHP 5 用这两行:
LoadModule php5_module “c:/php/php5apache2.dll”
AddType application/x-httpd-php .php
这两种工作方式的区别:
在CGI模式下,如果客户机请求一个php文件,Web服务器就调用php-cgi.exe去解释这个文件,然后再把解释的结果返回给Web Serve,Web Serve以网页的形式返回给客户机;而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。
从某种意义上说,以Apache某块形式运行的php比FastCGI形式有着更好的安全性及执行效率和速度。
CGI (Common Gateway Interface) 通用网关接口,CGI是一种工具,他是用来沟通web服务器和客户端(浏览等)的桥梁,必须运行于网络服务器上面,可以通过很多脚本语言来实现,例如php
FastCGI的工作原理是:
1、Web Server 启动时FastCGI解析器进程也启动;
2、FastCGI解析进程初始化好后等待web Server 发来连接(如果没有连接一直等待,进程一直启动着);
3、当客户端请求到达Web Server时,FastCGI进程管理器会选择并连接其中一个CGI进程来进行解析。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。
4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。
FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以 FastCGI(无论搭配 IIS 6 或 IIS 7)执行 PHP ,都建议下载、执行 non-thread safe 的 PHP (PHP 的二進位檔有兩種包裝方式:msi 、zip ,請下載 zip 套件)。
而线程安全检查正是为ISAPI方式的PHP准备的,因为有许多php模块都不是线程安全的,所以需要使用Thread Safe的PHP。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。
FastCGI的官方站点在http://www.fastcgi.com
FastCGI的工作原理是:
1、Web Server 启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module);
2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。
4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi.exe在此便退出了。
在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
发表评论
-
引用和global
2013-02-01 18:05 793<?php $var1 = 1; $var ... -
面向对象之多态
2013-02-01 17:49 946Java实现 //定义接口Animal interf ... -
PHP HTTP Authentication
2012-11-22 17:39 858<?php $config['admin_ ... -
PHP实现的栈
2012-11-16 13:44 929<?php class Stack{ ... -
pearl && pecl
2012-09-21 15:02 925Pear:是PHP的扩展代码包,所有的扩展均以PHP代码的形式 ... -
PHP集成PayPal
2012-09-18 18:34 18601.注册开发者账号,注册完登陆,然后新建一个Business账 ... -
PHP中 Magic quotes
2012-06-26 17:45 1293什么是 Magic Quotes? Magic Quo ... -
php请求
2012-06-20 15:25 906wev-server处理一个php请求,是给 ... -
一个CURD的demo
2012-06-13 16:19 0一个后台管理的demo -
php
2012-06-09 18:22 0redis是个单线程的程序,为什么会这么快呢?每秒100 ... -
phpstorm3.0以下的注册码
2012-03-31 09:52 865EMBRACE ===== LICENSE B ... -
栈和队列
2012-03-13 15:48 7371.队列先进先出,栈先进后出。 2.对插入和 ... -
tmp
2012-03-12 09:13 0qxia@sh123 admin atlanti ... -
call_user_func函数和call_user_func_array函数
2012-03-09 14:56 9691.call_user_func函数是当需要动态调用函数时,才 ... -
SNS
2012-03-08 16:09 01.AS可以打包多个请求成一个包然后一起发送,服务端然后一个一 ... -
PHP this,self 和 parent 关键字
2012-02-29 22:23 862我们先建立几个概念,这三个关键字分别是用在什么地方 呢? ... -
一些截取的函数
2012-02-29 18:33 0<?php $str = 'abcdk123 ... -
细说PHP中strlen和mb_strlen的区别
2012-02-29 16:53 1279在PHP中,strlen与mb_strlen ... -
PHP数据库
2012-02-28 16:36 0但对于 PHP 语言来说它是放在 Apache 上的,每一个请 ... -
PHP取权重
2012-02-17 14:42 1031在实际的开发过程中,经常会用到一些几率的时间,例如有这样一个奖 ...
相关推荐
DayinCMS 3D模型管理系统是一款基于PHP MYSQL,是一款针对3D打印模型分享的通用开源程序。 1、专向开发,针对3D打印模型分享的需求,支持模型上传,模型展示,模型预定等功能,也可以用在图片素材管理。 2、多点缓存...
Server模型及其PHP实现, 对于掌握socket编程非常实用
PHP5的对象模型[1]--面向对象编程 PHP5的对象模型[2]--对象模型 PHP5的对象模型[3]--定义一个类 PHP5的对象模型[4]--构造函数和析构函数 PHP5的对象模型[5]--对象复制
基于PHP的DayinCMS3D模型管理系统php版源码.zip
PHP书写的自定义模型的类,可定义后台自定义数据,采用单一入口
三维展示BIM模型--php嵌套标签,支持各种前端页面的嵌套
PHP168支持对其他模型的字段替换
php:连表查询一对一和关联模型一对一,php:连表查询一对一和关联模型一对一php:连表查询一对一和关联模型一对一php:连表查询一对一和关联模型一对一php:连表查询一对一和关联模型一对一php:连表查询一对一和...
Phalcon 是开源、全功能栈、使用 C 扩展编写、针对高性能优化的 PHP 5 框架。 开发者不需要学习和使用 C 语言的功能, ... 其中模型是我们开发中常用的,可官方没有详细的中文api文档,本文档按照官方英文文档翻译过来
基于PHP的DayinCMS 3D模型管理系统 php版.zip
3、运行e/update/index.php; 4、运行转换程序后会提示转换完毕,然后删除update目录里面的文件; 5、修改栏目:将所有新闻栏目都设为使用“文章系统模型”; 6、删除新闻数据表的数据,将以下数据表...
基于php沙盘模型展示网站.zip
第三讲PHP开发模型.pdf
PHP实例开发源码—DayinCMS 3D模型管理系统 php版.zip
DayinCMS 3D模型管理系统是一款基于PHP MYSQL,是一款针对3D打印模型分享的通用开源程序。 1、专向开发,针对3D打印模型分享的需求,支持模型上传,模型展示,模型预定等功能,也可以用在图片素材管理。 2、多点...
注:对于那些自建新闻模型的用户,由于本人暂时无法找到文章模型和新闻模型在数据库中设置所关联的所有表,无法修改基配置,故转换方法迂回进行。 例如:一个表名称tiyu的新闻模型,想将其转换为表名为tiyu文章...
再加上 PHP 中没有什么好用的工作流,于是干脆自己设计一个,设计的原则 如下: 1 根据 80/20 原则,只使用 wfmc 模型中最符合自身应用的 20%功能 2 充分吸收国内使用 jbpm 开发 BOSS 中遇到的问题,工作流引擎只...
基于PHP的仿迪恩CG模型教程下载网站模板 php版 v2.0.zip
具有PHP数据访问对象(PHPPDO-DAO)和模型视图控制器(MVC)的PHP Web项目.zip