自己动手用 C 扩展 PHP(三)- 重要ZEND API函数

引言:
   有感于大多数人认为 PHP 只是一种弱类型,只能做小型web应用的脚本语言。 与目前的Java, .Net平台有一定的差距,所以决定写一些 PHP 的扩展方法文章,我相信
我们PHPER们通过自己动手写商业扩展,一定能构建出强大的,极速的Web应用,因为扩展本身就是编译型语言编写的(c/c++),而且可以
预先驻留内存的(Apache启动时加载),有了 C/C++ 编写的扩展,我们几乎可以无所不能.
   呵呵,Zend 的说明文档少之又少,真令人头疼 :)

———————————————————–

在上两章里讲述了扩展模块的基本用法,相信读者已经能够构建自己的扩展模块了,接下来,我们来看看几个重要的函数:

1. PHP_MINIT_FUNCTION(MyModule);
   当模块被Zend Engine(ZE)加载后,例如Apache启动,加载了PHP模块,ZE会对每一个扩展模块调用此函数(如果有的话),可以在该函数里进行一些初始化操作.

2. PHP_RINIT_FUNCTION(MyModule);
   对于每一个"使用"该模块的PHP脚本请求前,都执行该函数(如果有的话),最好的例子: Session 扩展模块, 如果在一个PHP脚本里执行session.start(), Session模块的PHP_RINIT_FUNCTION()将被调用. 详情可以看看 session模块 的源代码

3. PHP_RSHUTDOWN_FUNCTION(MyModule);
   与PHP_RINIT_FUNCTION()相反,该函数是在一个 PHP 脚本执行完毕后执行.

4. PHP_MSHUTDOWN_FUNCTION(MyModule);
   当ZE收到shutdown信号后,例如apache卸载PHP模块,ZE 对每一个模块调用此函数,最后关闭自己的核心子系统.

——————————————————-
如何使用以上的函数?

首先,在头文件("mymodule.h")里声明:

PHP_MINIT_FUNCTION(MyModule);
PHP_MSHUTDOWN_FUNCTION(MyModule);
PHP_RINIT_FUNCTION(MyModule);
PHP_RSHUTDOWN_FUNCTION(MyModule);

然后在你的 "mymodule.c" 里实现zend_module_entry结构:

zend_module_entry MyModule_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
#endif
    "MyModule",
    MyModule_functions,
    PHP_MINIT(MyModule),
    PHP_MSHUTDOWN(MyModule),
    PHP_RINIT(MyModule),    
         PHP_RSHUTDOWN(MyModule),
    NULL,
#if ZEND_MODULE_API_NO >= 20010901
    "0.1",
#endif
    STANDARD_MODULE_PROPERTIES
};

// 实现 PHP_MINIT_FUNCTION() 等等 …
PHP_MINIT_FUNCTION(MyModule)
{
    // 你的实现代码 …
    return SUCCESS;
}

其实 ext 目录下的 ext_skel 程序建立扩展模块代码框架的时候都自动化帮你实现了这些结构,依照说明填充需要的代码即可.

————————————————-
下章再介绍 php.ini 的配置设定及读取

待续 …

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 PHP Zend 扩展示例: 1. 创建扩展目录 首先,我们需要在 PHP 扩展目录中创建一个新目录来存储我们的扩展。可以使用以下命令: ``` mkdir /path/to/php/ext/myextension ``` 2. 创建扩展文件 在扩展目录中创建一个名为 `myextension.c` 的新文件。将以下内容复制到文件中: ```c #include "php_myextension.h" PHP_FUNCTION(hello_world) { php_printf("Hello, world!\n"); } static const zend_function_entry myextension_functions[] = { PHP_FE(hello_world, NULL) PHP_FE_END }; zend_module_entry myextension_module_entry = { STANDARD_MODULE_HEADER, "MyExtension", myextension_functions, NULL, NULL, NULL, NULL, NULL, "0.1", STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_MYEXTENSION ZEND_GET_MODULE(myextension) #endif ``` 3. 创建扩展头文件 在扩展目录中创建一个名为 `php_myextension.h` 的新文件。将以下内容复制到文件中: ```c #ifndef PHP_MYEXTENSION_H #define PHP_MYEXTENSION_H #include "php.h" extern zend_module_entry myextension_module_entry; #define phpext_myextension_ptr &myextension_module_entry #endif ``` 4. 创建配置文件 在扩展目录中创建一个名为 `config.m4` 的新文件。将以下内容复制到文件中: ```m4 PHP_ARG_ENABLE(myextension, whether to enable MyExtension support, [ --enable-myextension Enable MyExtension support]) if test $PHP_MYEXTENSION != "no"; then PHP_REQUIRE_CXX() PHP_SUBST(MYEXTENSION_SHARED_LIBADD) PHP_ADD_LIBRARY_WITH_PATH(mylibrary, /path/to/mylibrary/lib, MYEXTENSION_SHARED_LIBADD) PHP_NEW_EXTENSION(myextension, myextension.c, $ext_shared) fi ``` 5. 编译和安装 使用以下命令来编译和安装扩展: ``` cd /path/to/php/ext/myextension phpize ./configure --enable-myextension make sudo make install ``` 6. 配置 php.ini 在 php.ini 文件中添加以下行: ``` extension=myextension.so ``` 7. 测试扩展 使用以下 PHP 代码测试新扩展: ```php <?php hello_world(); ?> ``` 输出应该是: ``` Hello, world! ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值