声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。欢迎转载,转载请注明出处 。本文地址:http://imsiren.com/archives/547
一个简单的扩展模块
PHP非常容易扩展,因为它提供了我们想用的所有API.
如果要新建一个扩展,需要在PHP源码中执行ext_skel
位置 PHP源码目录/ext/ext_skel
它有几个参数
–extname=module module is the name of your extension
–proto=file file contains prototypes of functions to create
–stubs=file generate only function stubs in file
–xml generate xml documentation to be added to phpdoc-cvs
–skel=dir path to the skeleton directory
–full-xml generate xml documentation for a self-contained extension
(not yet implemented)
–no-help don’t try to be nice and create comments in the code
and helper functions to test if the module compiled
如果我们要建一个 扩展名称为siren的模块,那么我们只要执行
ext_skel –extname=siren 它就会在 ext/目录下生成以 模块名称为名的文件夹.而且还会创建一些文件:
config.m4 config.w32 CREDITS EXPERIMENTAL php_siren.h siren.c siren.php tests
config.m4 和config.w32是我们的配置文件,我是在linux下编译的 所以要修改config.m4文件
两种加载方式 with 和 enable<!--EndFragment-->
enable方式 需要重新编译PHP ,这样是非常浪费时间的,所以我把它编译为so模块..所以就用 with啦dnl PHP_ARG_WITH(siren, for siren support,dnl Make sure that the comment is aligned:dnl [ --with-siren Include siren support])为PHP_ARG_WITH(siren, for siren support,Make sure that the comment is aligned:[ --with-siren Include siren support])这样在编译PHP的时候 –with-siren就可以加载此模块,也可以在php.ini中extension 模块.在ext/siren目录下有一个siren.c文件它提供了一个默认函数<!--EndFragment-->
如果看过 我之前的文章,你肯定明白 如果不知道 那就看看这篇文章
http://imsiren.com/archives/196
下面看看如何编译到PHP
1. /usr/local/php53/bin/phpize
2../configure –with-php-config=/usr/local/php53/bin/php-config
3.make && make install
这样 就会在/usr/local/php53/lib/php/extensions/no-debug-non-zts-20090626/目录下生成一个siren.so文件
这样 一个简单的扩展模块就完成了..我们在PHP.INI里面开启此模块
重启apache/nginx, 这样 在php文件里 就可以 执行 confirm_siren_compiled函数了.
下面我们就详细讲解一下里面的东西
首先是 php_siren.h
它是siren.c加载的头文件
<!--EndFragment-->
上面有几个 PHP_*的函数,他们的作用如下
PHP_MINIT_FUNCTION() 当PHP被装载时,模块启动函数即被Zend引擎调用,这里可以做一些初始化操作
PHP_MSHUTDOWN_FUNCTION() 当PHP完全关闭时,Zend引擎调用的函数,
PHP_RINIT_FUNCTION() 在每次PHP请求开始,请求前启动函数被调用。通常用于管理请求前逻辑。
PHP_RSHUTDOWN_FUNCTION() 在每次PHP请求结束后,请求前关闭函数被调用。经常应用在清理请求前启动函数的逻辑。
PHP_MINFO_FUNCTION() 调用phpinfo()时模块信息函数被呼叫,从而打印出模块信息。
这些函数的代码都定义在siren.c文件中.
<!--EndFragment-->
第21行 zend_function_entry是一个结构体<!--EndFragment-->
上面就是定义了一个函数数组
PHP_FE是一个宏.
等于
#define ZEND_FENTRY(zend_name, name, arg_info, flags) { #zend_name, name, arg_info, (zend_uint) (sizeof(arg_info)/sizeof(struct _zend_arg_info)-1), flags },
只是做了一些初始化.
PHP_FE_END 等于 { NULL, NULL, NULL, 0, 0 }
用来结束数组
zend_module_entry 是一个结构体,用来保存模块信息
<!--EndFragment-->
主要字段都在代码里注释了创建一个 zend_module_entry对象<!--EndFragment-->
STANDARD_MODULE_HEADER宏:sizeof(zend_module_entry), ZEND_MODULE_API_NO, ZEND_DEBUG, USING_ZTS用来填充 前面四个参数第48行:只有你的模块编译成 动态模块的时候才会被调用.这个函数的作用就是把模块的信息块传递 给Zend 并通知 Zend 获取这个模块的相关内容54-57行:我们在写PHP的时候,php.ini里面的配置都会影响我们PHP代码的执行,比如register_global 等.此处代码的作用就是获取php.ini里面的配置信息.
<!--EndFragment-->
STD_PHP_INI_ENTRY宏:注册php INI的指令:
接受的参数列表如下
name: php.ini里面的名称
default_value: //默认值,永远都是字符串
modifiable: ini可以被改变的地方 值如下
PHP_INI_SYSTEM. 能够在php.ini或http.conf等系统文件更改
PHP_INI_PERDIR. 能够在 .htaccess中更改
PHP_INI_USER. 能够被用户脚本更改
PHP_INI_ALL. 能够在所有地方更改
on_modify: 处理INI条目更改的回调函数。你不需自己编写处理程序,使用下面提供的函数。包括:
OnUpdateInt
OnUpdateString
OnUpdateBool
OnUpdateStringUnempty
OnUpdateReal
property_name: 应当被更新的变量名
struct_type: 变量驻留的结构类型。因为通常使用全局变量机制,所以这个类型自动被定义,类似于zend_myfile_globals。
struct_ptr: 全局结构名。如果使用全局变量机制,该名为myfile_globals。
剩下的东西就是我们上面提到的一些 启动模块时执行的函数…
明白了这些,再去写模块头就不会大啦…
<!--EndFragment-->
<!--EndFragment-->
分享到:
相关推荐
在IT领域,有时候我们需要利用不同编程语言的优势来完成复杂任务,比如使用PHP处理Web应用程序,同时结合C或C++的高效性能。这篇笔记主要探讨如何在PHP中调用由C或C++编译生成的动态链接库(.so文件),以此实现PHP...
- 在左侧的扩展面板中搜索"C/C++"并安装来自Microsoft的官方C/C++扩展。 - 安装完成后,重启VS Code以确保扩展生效。 #### 3. 安装C/C++编译器 为了能够编译和构建C/C++代码,还需要安装相应的编译器。常见的选择...
在使用Visual Studio 2008进行C/C++开发PHP扩展的过程中,首先需要构建一个完整的开发环境,确保所有必要的软件和工具都已正确安装并配置好。以下是对给定文件中涉及的关键知识点的详细解析: ### 环境搭建与配置 ...
- **Eclipse3.06**:作为一款多功能集成开发环境(IDE),Eclipse最初因支持Java开发而知名,但通过插件扩展,它同样能胜任C/C++项目的开发。下载地址:[http://www.eclipse.org/downloads/index.php]...
Eclipse是一款广泛使用的开源集成开发环境(IDE),尤其在Java编程领域中占据着重要的地位。为了提高开发效率和代码质量,Eclipse支持安装各种插件。"eclipse常用插件更新地址"指的是开发者可以通过这些地址获取并...
在C/C++中,我们主要使用`socket()`, `bind()`, `listen()`, `accept()`, `send()`, `recv()`等函数来创建、连接、监听和通信。 2. HTTP协议:超文本传输协议(HTTP)是用于从万维网服务器传输超文本到本地浏览器的...
Eclipse是一款强大的集成开发环境(IDE),最初主要用于Java开发,但通过扩展,它也能支持C++和C语言的开发。这个配置过程主要涉及Eclipse的CDT(C/C++ Development Tooling)插件和MinGW(Minimalist GNU for ...
在本文中,我们将深入探讨如何使用C语言开发PHP扩展,并将其整合到PHP环境中。这是一个涉及多步骤的过程,从设置开发环境到编写C...这不仅可以帮助你扩展PHP的功能,也为深入理解PHP的内部工作原理提供了宝贵的经验。
C++ 是 C 语言的扩展,增加了面向对象编程(OOP)的概念,如类、对象、封装、继承和多态,使得它更适合大型软件项目的开发。 知识点包括: 1. C 语言的基本语法:变量、数据类型、运算符、控制结构(如条件语句、...
# c和c++编译器 yum -y install -y gcc gcc-c++ # PHP扩展依赖 yum install -y libxml2-devel openssl-devel libcurl-devel libjpeg-devel libpng-devel libicu-devel openldap-devel ./configure --prefix=/usr/...
由于C++的复杂性和标准问题,许多开发者更倾向于使用C进行系统底层开发,而C++则多用于需要高性能的场景。 JavaScript是一种主要用于网页前端开发的脚本语言。它的出现让网页具有了动态交互的能力,极大地丰富了...
编写node的C/C++原生扩展在Node Js下执行PHP 开发环境:Window/Linux(我在Debian X64下编译通过) Linux下编译脚本 cd /root/php-5.4.26/ ./buildconf --force ./configure --with-node=/usr/local/node-v0.10.26 make...
Eclipse C/C++ Development Toolkit(CDT)是针对Linux平台的一款强大的集成开发环境(IDE),专为C和C++编程语言设计。它基于Eclipse框架,提供了丰富的功能,包括源代码编辑、项目管理、调试器集成、构建系统支持...
总的来说,FastCGI通过优化CGI的运行机制,提高了Web服务的性能和可扩展性,尤其对于C/C++开发者,提供了编写高效Web应用程序的途径。尽管现代Web开发中还有其他如PHP-FPM、WSGI等接口,但FastCGI仍然在某些场景下...
版权所有(C)2010 Happy Fish / YuQing libfastcommon仅可根据Less GNU通用公共许可证(LGPL)的条款进行复制。 请访问libfastcommon主页以获取更多详细信息。...一些功能被包装到php扩展中,例如fastcommon_ge