`
dengbaoleng
  • 浏览: 1131639 次
文章分类
社区版块
存档分类
最新评论

原:用C/C++扩展PHP

阅读更多
声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
欢迎转载,转载请注明出处 。

本文地址: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-->
分享到:
评论

相关推荐

    Visual Studio Code配置C/C++开发环境的教程图解

    VS code的环境配置真是要了我的老命…… ...安装C/C++扩展 调试运行环境 1.新建一个CPP文件 2.创建launch.json文件 选择编译按钮-&gt;自定义运行和调试创建launch.json文件-&gt;选择环境C++(GDB//LLDB) 选择配置g

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

    英文版下载: PHP 5 Power Programming https://www.jb51.net/books/61020.html PHP取得成功的一个主要原因之一是她拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到。PHP发行包包括...

    php-5.6.37.tar.gz下载及php5.6源码安装说明

    # 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/...

    php调用c++的方法

    在此文件夹中新建c++文件sort.cpp,如下 ... 您可能感兴趣的文章:用C/C++扩展你的PHP 为你的php增加功能windows服务器下IIS6/7下PHP 无法加载 php_curl.dll 等动态链接库PHP中调用C/C++制作的动态链接库的教程

    Node.js C++原生扩展&PHP SAPI

    编写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...

    从我的开源项目FastDFS中提取的c公共函数库。 这个库非常简单和稳定。 函数包括:字符串,记录器,链,哈希,套接字,ini文件读取器,base64编码/解码,URL编码/解码,快速计时器,跳过列表,对象池等。详细信息请参见c头文件。-C/C++开发

    版权所有(C)2010 Happy Fish / YuQing libfastcommon仅可根据Less GNU通用公共许可证(LGPL)的条款进行复制。 请访问libfastcommon主页以获取更多详细信息。...一些功能被包装到php扩展中,例如fastcommon_ge

    vs2008下用c、c++ 开发 PHP 扩展.doc

    整理的关于windows下开发PHP扩展的及环境搭建说明

    C/C++覆盖率在NGINX测试中的应用

    C/C++程序的代码覆盖率统计工具非常少,与JAVA相比开源免费的工具更是寥寥无几,好用又开源的简直是凤毛麟角。左挑右选最后看中了基于GCOV的LCOV作为NGINX测试的覆盖率统计工具。选择LCOV的原因很简单:一是适合GCOV...

    从C/C++迁移到PHP——判断字符类型的函数

    在C/C++中,头文件ctype.h中定义了关于字符类型一组宏,可以得到给定字符的类型。 而PHP中没有相关函数。前些天发现在www.mm4.de下载的PHP中提供了一个名为php_ctype.dll的扩展库, 加载后发现提供一部分此类的函数...

    如何在centos8自定义目录安装php7.3

    1.目录结构 源码目录:/home/werben/pkgsrc/php-7.3.11 安装目录:/home/werben/application/php7.3.11 2.下载php源码 # 官网地址:https://www.php.net/downloads.php ...yum install -y gcc gcc-c++ yum -y install

    使用c语言开发php扩展教程

    这里记录着使用c语言进行开发程序,然后在将开发的程序进行打包成为php扩展进行使用,从c写直到php调用动态链接库都详细记录着教程,看这个就知道开发了

    快速开发一个PHP扩展图文教程

    要求:了解C/C++编程,熟悉PHP编程 环境:下载一份php对应版本的源码,我这里是 php-5.2.6,先正常安装php,假设我们的php安装在 /usr/local/php 目录,源码在 /root/soft/php/php-5.2.6/,现在开始!步骤一:生成...

    Atomineer Pro Documentation Trial 9.44 Cracked

    如产生法律纠纷与本人无关 AtomineerUtils是国外的一款用于生成源代码注释的一款VS插件,官方网站:http://www.atomineerutils.com/products.php 通过链接,可以看出这款插件的功能十分强大,这款插件,支持C、C++、...

    CnWizards V0.9.0.470

    + 函数过程列表增加对 C/C++ 的类的支持,以及其它更新。 * 清理引用单元增加对 Delphi 2009 的支持。 * 编辑器浮动工具按钮修补一处快捷键失效的问题。 * 浮动工具条躲开 Delphi 2009 下一处 VCL Bug 引发的失去...

    hhvm-yaf:hhvm-yaf是php-yaf的hhvm扩展

    用c编写并作为HHVM扩展构建PHP框架。 您可以在uri中找到以php扩展名构建的php-yaf: : 要求 HHVM 3.1以上 安装 安装Yaf 在Linux上编译Yaf $ git clone https://github.com/sherlockhua/hhvm-yaf.git $ /path/to/...

    PHP中调用C/C++制作的动态链接库的教程

    一般而言,php速度已经比较快,但是,对于一些较高级开发者而言,如果想要追求更快的速度,那毫无疑问可以通过自己写c代码,并编译为动态链接库(常为.so文件),然后php通过创建一个新的扩展(extension),并在扩展里...

    基于openssl密码库编写的sm2国密算法PHP扩展.rar

    EVP框架是对openssl提供的所有算法进行了封装,在使用工程中只需要...利用OpenSSL提供的库函数,用C/C++编写: 1.编写程序生成RSA密钥对,并保存公钥到文 openssl详解api编程 https://blog.51cto.com/u_16099174/6324509

    探讨:如何编写PHP扩展

    用C/C++扩展PHP的优缺点:优点:效率,还是效率减少PHP脚本的复杂度, 极端情况下, 你只需要在PHP脚本中,简单的调用一个扩展实现的函数,然后你所有的功能都就被扩展实现了而缺点也是显而易见的:开发复杂可维护性...

Global site tag (gtag.js) - Google Analytics