如何用C语言编写PHP扩展的详解


Posted in PHP onJune 13, 2013

1:预定义
在home目录,也可以其他任意目录,写一个文件,例如caleng_module.def
内容是你希望定义的函数名以及参数:
int a(int x,int y)
string b(string str,int n)

2:到php源码目录的ext目录
#cd /usr/local/php-5.4.0/ext/

执行命令,生成对应扩展目录
#./ext_skel --extname=caleng_module --proto=/home/hm/caleng_module.def

3:修改config.m4
去掉dnl的注释

PHP_ARG_ENABLE(caleng_module, whether to enable caleng_module support,
Make sure that the comment is aligned:
[  --enable-caleng_module           Enable caleng_module support])

4:修改caleng_module.c

/* {{{ proto int a(int x, int y)
    */
PHP_FUNCTION(a)
{
 int argc = ZEND_NUM_ARGS();
 int x;
 int y;
    int z;
 if (zend_parse_parameters(argc TSRMLS_CC, "ll", &x, &y) == FAILURE)   return;
z=x+y;
  RETURN_LONG(z);
}
/* }}} */
/* {{{ proto string b(string str, int n)
    */
PHP_FUNCTION(b)
{
 char *str = NULL;
    int argc = ZEND_NUM_ARGS();
    int str_len;
    long n;
    char *result;
    char *ptr;
    int result_length;
    if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE)
        return;
    result_length = str_len * n;
    result = (char *) emalloc(result_length + 1);
    ptr = result;
    while (n--) {
        memcpy(ptr, str, str_len);
        ptr += str_len;
    }
    *ptr = '\0';
    RETURN_STRINGL(result, result_length, 0);
}
/* }}} */

5:生成扩展库
#cd ./caleng_module
#/usr/local/php/bin/phpize
#./configure --with-php-config=/usr/local/php/bin/php-config
#make
#make install

如何用C语言编写PHP扩展的详解

6:到php的对应extensions目录
如上图所示
#cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
改目录下有生成的caleng_module.so文件

7:修改php.ini
php.ini如果找不到可以从phpinfo()打出的信息看到
#cd /usr/local/php/lib/
php.ini增加扩展信息
extension=caleng_module.so
 
8:重启Apache
# /usr/local/apache2/bin/apachectl restart

9:检查加载
 /usr/local/php/bin/php -m

10:PHP调用

echo a(1,2);

输出 3  就说明成功了!
=================================
下面是原文
Linux下用C开发PHP扩展
一、首先下载PHP源码包,假设源码包目录为:/software/php-5.2.13
一、首先下载PHP源码包,假设源码包目录为:/software/php-5.2.13
#> cd /software/php-5.2.13/ext
二、假设我们要开发一个名为caleng_module的扩展,该扩展包含两个函数:a--处理两个整型相加和b-处理字符串重复输出;
1、首先编写一个函数定义文件,该文件编写函数原型后缀为def,假设为:caleng_module.def
int a(int x, int y)
string b(string str, int n)
2、通过扩展骨架生成器,将在ext目录下自动建立扩展目录caleng_module
#> ./ext_skel --extname=caleng_module --proto=caleng_module.def
3、修改配置文件: #> vim /software/php-5.2.13/ext/caleng_module/config.m4,将如下行的注释标签"dnl"去掉,修改后如下所示:
PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support,
Make sure that the comment is aligned:
[  --enable-myfunctions           Enable myfunctions support])
4、完善函数a和b的功能: #> vim /software/php-5.2.13/ext/caleng_module/caleng_module.c
PHP_FUNCTION(a)
{
    int x, y, z;

    int argc = ZEND_NUM_ARGS();

    if (zend_parse_parameters(argc TSRMLS_CC, "ll", &x, &y) == FAILURE)
        return;
    z = x + y;
    RETURN_LONG(z);
}
PHP_FUNCTION(b)
{
    char *str = NULL;
    int argc = ZEND_NUM_ARGS();
    int str_len;
    long n;
    char *result;
    char *ptr;
    int result_length;

    if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE)
        return;
    result_length = str_len * n;
    result = (char *) emalloc(result_length + 1);
    ptr = result;
    while (n--) {
        memcpy(ptr, str, str_len);
        ptr += str_len;
    }
    *ptr = '\0';
    RETURN_STRINGL(result, result_length, 0);
}
三、编译安装,假设php的安装目录为:/usr/localhost/webserver/php
#> cd /software/php-5.2.13/ext/caleng_module
#> /usr/localhost/webserver/php/bin/phpize
#> ./configure --with-php-config=/usr/localhost/webserver/php/bin/php-config
#> make
#> make install
现在将在/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613目录下生成caleng_module.so文件
在php.ini配置文件中加入: extension=caleng_module.so.
搞定收工

PHP 相关文章推荐
E路文章系统PHP
Dec 11 PHP
提高define性能的php扩展hidef的安装和使用
Jun 14 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
详解PHP中的null合并运算符
Dec 30 PHP
thinkphp3.2实现上传图片的控制器方法
Apr 28 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
Aug 06 PHP
php+ajax实现商品对比功能示例
Apr 13 PHP
PHP优化之批量操作MySQL实例分析
Apr 23 PHP
php array_map()函数实例用法
Mar 03 PHP
探讨:如何编写PHP扩展
Jun 13 #PHP
PHP APC的安装与使用详解
Jun 13 #PHP
eAccelerator的安装与使用详解
Jun 13 #PHP
探讨Hessian在PHP中的使用分析
Jun 13 #PHP
深入PHP变量存储的详解
Jun 13 #PHP
深入PHP中的HashTable结构详解
Jun 13 #PHP
基于PHP输出缓存(output_buffering)的深入理解
Jun 13 #PHP
You might like
php实例分享之mysql数据备份
2014/05/19 PHP
php随机生成数字字母组合的方法
2015/03/18 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
JavaScript对数字的判断与处理实例分析
2015/02/02 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Python实现的数据结构与算法之链表详解
2015/04/22 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
python中while和for的区别总结
2019/06/28 Python
Python字符串对象实现原理详解
2019/07/01 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
实例讲解CSS3中的box-flex弹性盒属性布局
2016/06/09 HTML / CSS
毕业生的自我评价分享
2013/12/18 职场文书
生产车间标语
2014/06/11 职场文书
学校交通安全责任书
2014/08/25 职场文书
爱国影片观后感
2015/06/18 职场文书
锦旗赠语
2015/06/23 职场文书
党纪处分决定书
2015/06/24 职场文书
详解Vue的sync修饰符
2021/05/15 Vue.js