快速开发一个PHP扩展图文教程


Posted in PHP onDecember 12, 2008

需求:比如开发一个叫做 heiyeluren 的扩展,扩展里就一个函数 heiyeluren_test(),输入一个字符串,函数返回:Your input string: xxxxx。
要求:了解C/C++编程,熟悉PHP编程
环境:下载一份php对应版本的源码,我这里是 php-5.2.6,先正常安装php,假设我们的php安装在 /usr/local/php 目录,源码在 /root/soft/php/php-5.2.6/,现在开始!
步骤一:生成扩展框架

cd /root/soft/php/php-5.2.6/ext
./ext_skel --extname=heiyeluren
cd /root/soft/php/php-5.2.6/ext/heiyeluren
vi config.m4
打开文件后去掉 dnl ,获得下面的信息:
PHP_ARG_ENABLE(heiyeluren, whether to enable heiyeluren support,
[  --enable-heiyeluren           Enable heiyeluren support])

保存退出.
(图01)
快速开发一个PHP扩展图文教程

 

 

第二步:编写代码

vi php_heiyeluren.h
找到:PHP_FUNCTION(confirm_heiyeluren_compiled); ,新增一行:
PHP_FUNCTION(heiyeluren_test);
保存退出。
(图02)
快速开发一个PHP扩展图文教程

vi heiyeluren.c
数组里增加我们的函数,找到 zend_function_entry heiyeluren_functions[],增加:
PHP_FE(heiyeluren, NULL)
(图03)

快速开发一个PHP扩展图文教程

 

再到 heiyeluren.c 文件最后面增加如下代码:
PHP_FUNCTION(heiyeluren_test)
{
    char *arg = NULL;
    int arg_len, len;
    char *strg;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
        return;
    }

    len = spprintf(&strg, 0, "Your input string: %s\n", arg);
    RETURN_STRINGL(strg, len, 0);
}
保存退出。
(图04)

快速开发一个PHP扩展图文教程

 

 

 

第三步:编译安装

cd /root/soft/php/php-5.2.6/ext/heiyeluren
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make test
make install

现在看看是不是有个 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/heiyeluren.so
编辑php.ini,把扩展加入进去:
vi /usr/local/php/lib/php.ini
在[PHP]模块下增加:
extension = heiyeluren.so
保存退出。
(图05)

快速开发一个PHP扩展图文教程

 

注意:如果你不存在扩展文件目录,或者安装报错,那么可以自行建立这个目录,然后把扩展拷贝到目录下,然后记得把 php.ini 文件中的 extension_dir 修改为该目录:
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
(图06)

快速开发一个PHP扩展图文教程

 

 

第四步:检查安装结果
现在看看模块加载了没有:
/usr/local/php/bin/php -m,应该会打印出:
[PHP Modules]
...
heiyeluren
...
[Zend Modules]

然后重启apache,输出 phpinfo() ,应该能够看到:
heiyeluren
heiyeluren support enabled

(图07)

快速开发一个PHP扩展图文教程

 

看看函数是否存在并且调用,在web目录下建立:heiyeluren.php
<?php
echo "<pre>";
print_r(get_loaded_extensions());
print_r(get_extension_funcs('heiyeluren'));
echo heiyeluren_test('My first php extension');
echo "</pre>";
?>

访问apache,应该能够看到:
Array
(
    ...
    [33] => heiyeluren
)
Array
(
    [0] => confirm_heiyeluren_compiled
    [1] => heiyeluren_test
)
Your input string: heiyeluren
(图08)

快速开发一个PHP扩展图文教程

扩展制作成功!

PHP 相关文章推荐
用PHP实现小写金额转换大写金额的代码(精确到分)
Jan 10 PHP
关于IIS php调用com组件的权限问题
Jan 11 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
php四种基础算法代码实例
Oct 29 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
PHP中常用的转义函数
Feb 28 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
php实现singleton()单例模式实例
Nov 06 PHP
PHP实现将textarea的值根据回车换行拆分至数组
Jun 10 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 PHP
Laravel下生成验证码的类
Nov 15 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP Google的translate API代码
Dec 10 #PHP
php escape URL编码
Dec 10 #PHP
php 破解防盗链图片函数
Dec 09 #PHP
中英文字符串翻转函数
Dec 09 #PHP
php2html php生成静态页函数
Dec 08 #PHP
php 远程图片保存到本地的函数类
Dec 08 #PHP
PHP 出现乱码和Sessions验证问题的解决方法!
Dec 06 #PHP
You might like
php+js实现异步图片上传实例分享
2014/06/02 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
在Python中移动目录结构的方法
2016/01/31 Python
Python打包可执行文件的方法详解
2016/09/19 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
Python实现Restful API的例子
2019/08/31 Python
dpn网络的pytorch实现方式
2020/01/14 Python
python缩进长度是否统一
2020/08/02 Python
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
职业生涯规划设计步骤
2014/01/12 职场文书
医学生自我评价
2014/01/27 职场文书
职称评定自我鉴定
2014/03/18 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
家长会主持词开场白
2015/05/29 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
jquery插件实现悬浮的菜单
2021/04/24 jQuery
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android