如何用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 相关文章推荐
BBS(php & mysql)完整版(二)
Oct 09 PHP
PHP脚本的10个技巧(8)
Oct 09 PHP
php 文件状态缓存带来的问题
Dec 14 PHP
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
PHP 异步执行方法,模拟多线程的应用分析
Jun 03 PHP
PHP过滤黑名单关键字的方法
Dec 01 PHP
php从memcache读取数据再批量写入mysql的方法
Dec 29 PHP
深入探究PHP的多进程编程方法
Aug 18 PHP
PHP实现微信发红包程序
Aug 24 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP获取二叉树镜像的方法
Jan 17 PHP
在Laravel中使用DataTables插件的方法
May 29 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 进行手机 APP 开发(API 接口开发)
2014/08/11 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
vue3修改link标签默认icon无效问题详解
2019/10/09 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
python处理二进制数据的方法
2015/06/03 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
python numpy库np.percentile用法说明
2020/06/08 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
Jogun Shop中文官网:韩国知名时尚男装网站
2016/10/12 全球购物
工程资料员岗位职责
2014/03/10 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
店铺转让协议书
2015/01/29 职场文书
十八大观后感
2015/06/12 职场文书
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python
详解Python中__new__方法的作用
2022/03/31 Python
virtualenv隔离Python环境的问题解析
2022/06/21 Python