如何用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 相关文章推荐
php桌面中心(一) 创建数据库
Mar 11 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
Nov 18 PHP
php自定义函数call_user_func和call_user_func_array详解
Jul 14 PHP
PHP多例模式介绍
Jun 24 PHP
php使用ICQ网关发送手机短信
Oct 30 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
May 15 PHP
PHP提高编程效率的20个要点
Sep 23 PHP
PHP安全下载文件的方法
Apr 07 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
PHP多进程简单实例小结
Nov 09 PHP
PHP tp5中使用原生sql查询代码实例
Oct 28 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
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
javascript与CSS复习(三)
2010/06/29 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
javascript的console.log()用法小结
2012/05/31 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
JavaScript无缝滚动效果的实例代码
2017/03/27 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
vue中v-model的应用及使用详解
2018/06/27 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
利用Python学习RabbitMQ消息队列
2015/11/30 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
Django 内置权限扩展案例详解
2019/03/04 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
CSS3实现多样的边框效果
2018/05/04 HTML / CSS
员工安全承诺书
2014/05/22 职场文书
十周年庆典策划方案
2014/06/03 职场文书
Python使用MapReduce进行简单的销售统计
2022/04/22 Python
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL