新版PHP极大的增强功能和性能

在经过长达8个月的开发和测试以后,PHP
4.3.0正式发布了。就范围,时间,成就方面而言,这是最全面的PHP发行版,而且,作为综合用途的脚本语言舞台的一个重要的竞争者,它将更进一步的提高了PHP的地位。
命令行界面
这个版本最终完成了独立的命令行界面(CLI),这可以用于开发内核和桌面应用程序。CLI是内建部分,但是在配置过程中,只有当CGI版本使用–disable-cgi开关时候,才自动安装;或者使用make
install-cli 。在Windows系统中,可以在cli目录找到CLI。
与其他服务器API相比较,CLI有许多的不同。请在“PHP手册:命令行中使用PHP”一章中找到更详细的内容。
Streams流
streams流API是一个非常重要的未披露的特征。在PHP内核和扩展中,引进了统一的方法来处理文件、管道、sockets和其他I/O资源。
这意味着对用户来说,任何使用streams流的I/O函数可以访问内置的协议,例如HTTP/HTTPS和FTP/FTPS,也可以通过PHP脚本登记使用自定义协议。请参考“已支持的协议/包列表”以获取更详细的内容。
新安装系统
安装系统在其他重复的地方,使用了一个全局的Makefile代替了缓慢的递归,并且降低了固定的相关性的综合程度。aclocal工具只需要automake。整个安装过程更轻便,消耗更少资源。
改进 PHP 4.3.x有许多的改进和增强的地方:
捆绑发行GD库而且推荐一直使用捆绑的版本的GD库
vpopmail和cybermut扩充移到PECL 删除几个不常用的扩充和SAPIs
提高了各种字符串处理函数的速度 删除Apache2过滤器,还在实验中
修正各种安全隐患(imap, mysql, mcrypt, file upload, gd等等)
在其他应用程序植入新的SAPI到PHP中 大量的测试套件 在dba, gd, pcntl,
sybase和xslt扩展重要的改进 新增的debug_backtrace()有助于调试
现在错误信息可以链接到描述错误或者函数问题的网页
Zend引擎修正小错误和做了小的性能的提高 大量的其他修正,更新和新功能等等

澳门新浦京8455com,1. PHP源码结构

PHP的内核子系统有两个,ZE(Zend Engine)和PHP Core.
ZE负责将PHP脚本解析成机器码(也成为token符)后,在进程空间执行这些机器码;ZE还负责内存管理,变量作用域管理和对PHP函数的调度管理。

PHP Core负责和SAPI层的通信;PHP Core也为safe_mode,
open_basedir的检查提供了统一控制层;PHP
Core还提供了streams层,用于用户域的文件和网络IO操作。其中SAPI(Server
Application Programming
Interface)通常包含Nginx,Apache,IIS,CLI,CGI等主机环境。

PHP扩展在ZE和PHP
Core的基础上提供对各种常用操作的封装,比如对mysql,redis,memcache,sqlite等的读写,对json,xml文件的解析,对soap,sokcet,curl的网络协议的封装,对加密解密压缩解压缩等的封装,对图像处理的封装等等。有些扩展是从零开始实现某个功能,比如按照redis的通信协议使用C来实现和redis的通信;有些扩展则是通过调用系统已有的库,比如图片处理的gb扩展需要系统本身要安装了相应的gd库。
在PHP源码php-5.6.24/ext中提供了78个扩展。

总之,由ZE和PHP Core提供基础的架构,由EXT提供用户域的各种操作。
以php-5.6.24源码为例,ZE对应文件夹php-5.6.24/Zend, PHP
Core对应文件夹php-5.6.24/main, 扩展对应文件夹php-5.6.24/ext。

2. PHP扩展的生命周期

PHP在接收到SAPI命令时,首先初始化并启动它的内核子系统,在内核子系统的启动快结束时,PHP开始加载它的扩展代码并对扩展初始化,此时PHP将调用每个模块的初始化例程Module
Initialization routine 。

MINIT(Module Initialization)
PHP调用MINIT相关例程,使得每个扩展有机会初始化内部变量、分配资源、注册资源处理句柄,以及向ZE注册自己的函数,以便于脚本调用这其中的函数时候ZE知道执行哪些代码

RINIT(Request Initialization)
在模块初始化完成后,PHP等待来自SAPI的请求,当接收到SAPI请求后,由ZE为当前被请求的php脚本创建运行环境,并调用每个扩展的Request
Initialization函数,使得每个扩展有机会设定特定的环境变量,根据请求分配资源,或者执行其他任务,如审核。

这里所说的SAPI请求分为两类,一类是Apache, IIS, 和其他成熟的web server
SAPIs,他们在启动时PHP先执行了MINIT,之后等待来自用户的页面请求,当收到请求后执行RINIT;另一类SAPI请求则是CGI
or CLI SAPIs,PHP在收到这类SAPI请求时,执行完MINIT马上就执行RINIT。

当RINIT请求初始化完毕后,ZE接回控制权并将当前被请求的脚本翻译成tokens,
最终构成opcodes,opcodes被执行过程中,如果某个opcode要求执行某个扩展函数,这是ZE就会将相关参数绑定到改函数,并将控制权临时交给该函数去执行,直到该函数执行完毕。

RSHUTDOWN(Request Shutdown)
PHP脚本运行结束后,PHP调用每个扩展的请求关闭(RSHUTDOWN)函数以执行最后的清理工作(如将session变量存入磁盘)。接下来,ZE执行清理过程,有效地对之前的请求期间用到的每个变量执行unset()。

MSHUTDOWN(Module Shutdown)
当RSHUTDOWN完成后,PHP继续等待SAPI的其他文档请求或者是关闭信号。对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。关闭期间,PHP再次遍历每个扩展,调用其模块关闭(MSHUTDOWN)函数,并最终关闭自己的内核子系统。

GINIT
初始化全局变量

GSHUTDOWN
释放全局变量

MINFO
设置phpinfo模块的信息,phpinfo要等级每个扩展的配置信息

// main/php.h #define PHP_MINIT       ZEND_MODULE_STARTUP_N #define PHP_MSHUTDOWN   ZEND_MODULE_SHUTDOWN_N #define PHP_RINIT       ZEND_MODULE_ACTIVATE_N #define PHP_RSHUTDOWN   ZEND_MODULE_DEACTIVATE_N #define PHP_MINFO       ZEND_MODULE_INFO_N #define PHP_GINIT       ZEND_GINIT #define PHP_GSHUTDOWN   ZEND_GSHUTDOWN #define PHP_MINIT_FUNCTION      ZEND_MODULE_STARTUP_D #define PHP_MSHUTDOWN_FUNCTION  ZEND_MODULE_SHUTDOWN_D #define PHP_RINIT_FUNCTION      ZEND_MODULE_ACTIVATE_D #define PHP_RSHUTDOWN_FUNCTION  ZEND_MODULE_DEACTIVATE_D #define PHP_MINFO_FUNCTION      ZEND_MODULE_INFO_D #define PHP_GINIT_FUNCTION      ZEND_GINIT_FUNCTION #define PHP_GSHUTDOWN_FUNCTION  ZEND_GSHUTDOWN_FUNCTION

3. PHP扩展的内存管理

ZE在执行自己内部的内存管理时,通过附加的标志来标识某某内存变量是否是持久性的,对于非持久内存,ZE会去清理。但在扩展内部最好还是自己去清理非持久内存,因为扩展自己请求分配的非持久内存,将在长时间内保持为未回收状态,这样与之相关的资源长时间得不到释放。

参考文章:Extension Writing Part I: Introduction to PHP and Zend

澳门新浦京8455com 1

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图