用C/C++扩展你的PHP 为你的php增加功能(6)


PHP_MINIT_FUNCTION(myfile){
/* If you have INI entries, uncomment these lines
ZEND_INIT_MODULE_GLOBALS(myfile, php_myfile_init_globals,NULL);

REGISTER_INI_ENTRIES();
*/

le_myfile = zend_register_list_destructors_ex(myfile_dtor,NULL,"standard-c-file", module_number);

return SUCCESS;
}


l 注意到le_myfile是一个已经被ext_skel脚本定义好的全局变量。

PHP_MINIT_FUNCTION()是一个先于模块(扩展)的启动函数,是暴露给扩展的一部分API。下表提供可用函数简要的说明。

函数声明宏   语义  
PHP_MINIT_FUNCTION()   当PHP被装载时,模块启动函数即被引擎调用。这使得引擎做一些例如资源类型,注册INI变量等的一次初始化。  
PHP_MSHUTDOWN_FUNCTION()   当PHP完全关闭时,模块关闭函数即被引擎调用。通常用于注销INI条目  
PHP_RINIT_FUNCTION()   在每次PHP请求开始,请求前启动函数被调用。通常用于管理请求前逻辑。  
PHP_RSHUTDOWN_FUNCTION()   在每次PHP请求结束后,请求前关闭函数被调用。经常应用在清理请求前启动函数的逻辑。  
PHP_MINFO_FUNCTION()   调用phpinfo()时模块信息函数被呼叫,从而打印出模块信息。  

新建和注册新资源 我们准备实现file_open()函数。当我们打开文件得到一个FILE *,我们需要利用资源机制注册它。下面的主要宏实现注册功能:

复制代码 代码如下:


ZEND_REGISTER_RESOURCE(rsrc_result, rsrc_pointer, rsrc_type);


参考表格对宏参数的解释

ZEND_REGISTER_RESOURCE 宏参数

宏参数   参数类型  
rsrc_result   zval *, which should be set with the registered resource information. zval * 设置为已注册资源信息  
rsrc_pointer   Pointer to our resource data. 资源数据指针  
rsrc_type   The resource id obtained when registering the resource type. 注册资源类型时获得的资源id  

文件函数
现在你知道了如何使用ZEND_REGISTER_RESOURCE()宏,并且准备好了开始编写file_open()函数。还有一个主题我们需要讲述。

当PHP运行在多线程服务器上,不能使用标准的C文件存取函数。这是因为在一个线程里正在运行的PHP脚本会改变当前工作目录,因此另外一个线程里的脚本使用相对路径则无法打开目标文件。为了阻止这种错误发生,PHP框架提供了称作VCWD (virtual current working directory 虚拟当前工作目录)宏,用来代替任何依赖当前工作目录的存取函数。这些宏与被替代的函数具备同样的功能,同时是被透明地处理。在某些没有标准C函数库平台的情况下,VCWD框架则不会得到支持。例如,Win32下不存在chown(),就不会有相应的VCWD_CHOWN()宏被定义。

VCWD列表
标准C库   VCWD宏  
getcwd()   VCWD_GETCWD()  
fopen()   VCWD_FOPEN  
open()   VCWD_OPEN() //用于两个参数的版本  
open()   VCWD_OPEN_MODE() //用于三个参数的open()版本  
creat()   VCWD_CREAT()  
chdir()   VCWD_CHDIR()  
getwd()   VCWD_GETWD()  
realpath()   VCWD_REALPATH()  
rename()   VCWD_RENAME()  
stat()   VCWD_STAT()  
lstat()   VCWD_LSTAT()  
unlink()   VCWD_UNLINK()  
mkdir()   VCWD_MKDIR()  
rmdir()   VCWD_RMDIR()  
opendir()   VCWD_OPENDIR()  
popen()   VCWD_POPEN()  
access()   VCWD_ACCESS()  
utime()   VCWD_UTIME()  
chmod()   VCWD_CHMOD()  
chown()   VCWD_CHOWN()  

编写利用资源的第一个PHP函数
实现file_open()应该非常简单,看起来像下面的样子:

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/613d4dbed6d1c77df2df5be069ee1b62.html