如何用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来写记数器(详细介绍)
Oct 09 PHP
我的论坛源代码(七)
Oct 09 PHP
坏狼php学习 计数器实例代码
Jun 15 PHP
php短域名转换为实际域名函数
Jan 17 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
PDO的安全处理与事物处理方法
Oct 31 PHP
PHP 多任务秒级定时器的实现方法
May 13 PHP
Linux下 php7安装redis的方法
Nov 01 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
Nov 30 PHP
PHP标准库(PHP SPL)详解
Mar 16 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
Oct 22 PHP
Laravel中Kafka的使用详解
Mar 24 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危险函数(disable_functions)
2012/02/23 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
Angular(5.2->6.1)升级小结
2018/12/27 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
AI人工智能 Python实现人机对话
2017/11/13 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
Python subprocess模块常见用法分析
2018/06/12 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
html5 标签
2009/07/16 HTML / CSS
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
生物制药专业自我鉴定
2014/02/19 职场文书
英文推荐信格式范文
2014/05/09 职场文书
新闻发布会策划方案
2014/06/12 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
个人融资协议书范本两则
2014/10/15 职场文书
画展邀请函
2015/01/31 职场文书
小学大队长竞选稿
2015/11/20 职场文书
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android
SQL SERVER中的流程控制语句
2022/05/25 SQL Server