如何用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 相关文章推荐
15种PHP Encoder的比较
Apr 17 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
php 正则表达式小结
Aug 31 PHP
php zip文件解压类代码
Dec 02 PHP
PHP中的string类型使用说明
Jul 27 PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 PHP
浅谈php优化需要注意的地方
Nov 27 PHP
PHP中使用CURL获取页面title例子
Jan 07 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
深入浅析Yii admin的权限控制
Aug 31 PHP
使用Codeigniter重写insert的方法(推荐)
Mar 23 PHP
PHP 对象继承原理与简单用法示例
Apr 21 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编写的一个E-mail验证类
2015/03/25 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
JS backgroundImage控制
2009/05/19 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
Javascript实现一朵从含苞到绽放的玫瑰
2019/03/30 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
javascript实现前端成语点击验证
2020/06/24 Javascript
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
常见python正则用法的简单实例
2016/06/21 Python
答题辅助python代码实现
2018/01/16 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
new修饰符是起什么作用
2015/06/28 面试题
考察现实表现材料
2014/05/19 职场文书
纪律教育月活动总结
2014/08/26 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
Win10系统下配置Java环境变量
2021/06/13 Java/Android
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs