PHP运行机制

来源:互联网 发布:ds video windows 编辑:程序博客网 时间:2024/05/17 21:58
PHP运行机制

 Java解决方案中,JSP和Servlet是作为独立的Java应用程序执行的,它们在初始化之后就驻留内存,通过特定的接口和Web服务器通信,完成相应工作。因此可使用数据库连接池缓存技术。


 ASP.NET的机制与此类似。虽然也是一种解释型语言,但是仍然提供了Application对象来存放应用程序级的全局变量,它依托于ASP解释器在IIS中驻留的进程,在整个应用程序的生命期有效。


 PHP 是一种纯解释型在服务端执行的可以内嵌HTML的脚本语言,尤其适合开发Web应用程序。请求一个 PHP 脚本时,PHP 会读取该脚本,并将其编译为 Zend 操作码,这是要执行的代码的一种二进制表示形式。随后,此操作码由 PHP 执行并丢弃。 PHP脚本在每次被解释时进行初始化,在解释完毕后终止运行。这种运行是互相独立的,每一次请求都会创建一个单独的进程或线程,来解释相应的页面文件。页 面创建的变量和其他对象,都只在当前的页面内部可见,无法跨越页面访问。在终止运行后,页面中申请的、没有被代码显式释放的外部资源,包括内存、数据库连 接、文件句柄、Socket连接等,都会被强行释放。也就是说,PHP无法在语言级别上实现直接访问跨越页面的变量,也无法创建驻留内存的对象。


 PHP 这种独特的工作模型的优势在于,基本上解决了令人头疼的资源泄漏问题。Web应用的特点是大量的、短时间的并发处理,对各种资源的申请和释放工作非常频 繁,很容易导致泄漏甚至崩溃。PHP的运行机制决定它不存在常规的崩溃问题(顶多连接超时脚本停止执行),可以说PHP是较稳定的Web应用。但是,这种 机制的缺点也非常明显。最直接的后果是,PHP在语言级别无法实现跨页面的缓冲机制。这种缓冲机制缺失造成的影响,可以分成两个方面:一是对象的缓冲、二 是数据库连接的缓冲。PHP的工作模型即是缺点也是优势。


 深入探讨
  Apache启动后,PHP解释程序也随之启动; 

  PHP的启动过程有两步; 


  第一步是初始化一些环境变量,这将在整个SAPI生命周期中发生作用; 
  第二步是生成只针对当前请求的一些变量设置。
  如同PHP启动一样,PHP的关闭也分两步:
 PHP启动第一步:第一步也是最主要的一步,第一步的操作在任何请求到达之前就发生了。
  启动Apache后,PHP解释程序也随之启动; 
  PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧; 

  MINIT的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。


 PHP启动第二步:
  当一个页面请求发生时,SAPI层将控制权交给PHP层。于是PHP设置了用于回复本次请求所需的环境变量。同时,它还建立一个变量表,用来存放执行过程中产生的变量名和值。 
  PHP调用模块的RINIT方法即“请求初始化”。例子是Session模块的RINIT,如果在php.ini中启用了Session模块,在调用该模块的RINIT时就会初始化$_SESSION变量,并将相关内容读入; 
  RINIT方法可以看作是一个准备过程,在程序执行之间就会自动启动。
 PHP关闭第一步:
  一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数中止),PHP就会启动清理程序。它会按顺序调用各个模块的RSHUTDOWN方法。 
  RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。 
 PHP关闭第二步:最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步:
  PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。 
  这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”(http://www.myext.cn/Article/920.html)。
PHP游戏实例:网页游戏地下城与勇士、、策略游戏分析猜测、单词链通过一个单词生成单词链(http://www.ibm.com/developerworks/cn/opensource/os-php-gamescripts3/)。
0 0