如何用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(3)
Oct 09 PHP
帖几个PHP的无限分类实现想法~
Jan 02 PHP
小文件php+SQLite存储方案
Sep 04 PHP
php 中的4种标记风格介绍
May 10 PHP
header导出Excel应用示例
Jan 24 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
Nov 19 PHP
php写入数据到CSV文件的方法
Mar 14 PHP
Twig模板引擎用法入门教程
Jan 20 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 PHP
php截取视频指定帧为图片
May 16 PHP
php使用curl实现ftp文件下载功能
May 16 PHP
PHP实现负载均衡下的session共用功能
Apr 17 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中常用字符串处理代码片段整理
2011/11/07 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
jQuery实现form表单reset按钮重置清空表单功能
2012/12/18 Javascript
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
Angular的$http与$location
2016/12/26 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
Python实现文件复制删除
2016/04/19 Python
python3使用pyqt5制作一个超简单浏览器的实例
2017/10/19 Python
带你认识Django
2019/01/15 Python
python实现抖音点赞功能
2019/04/07 Python
python Kmeans算法原理深入解析
2019/08/23 Python
Pytorch之parameters的使用
2019/12/31 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
消防器材管理制度
2014/01/28 职场文书
工作态度检讨书
2014/02/11 职场文书
一岗双责责任书
2014/04/15 职场文书
写给医生的感谢信
2015/01/22 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
人生感悟经典句子
2019/08/20 职场文书
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers