快速开发一个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中++i 与 i++ 的区别
Aug 08 PHP
基于php在各种web服务器的运行模式详解
Jun 03 PHP
深入PHP中慎用双等于(==)的详解
Jun 06 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
php修改指定文件后缀的方法
Sep 11 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
PHP文件缓存类实现代码
Oct 26 PHP
PHP测试成功的邮件发送案例
Oct 26 PHP
项目中应用Redis+Php的场景
May 22 PHP
PHP实现的自定义数组排序函数与排序类示例
Nov 18 PHP
老生常谈PHP面向对象之解释器模式
May 17 PHP
深入研究PHP中的preg_replace和代码执行
Aug 15 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
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
JavaScript入门教程 Cookies
2009/01/31 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
AngularJS 执行流程详细介绍
2016/08/18 Javascript
Angularjs 创建可复用组件实例代码
2016/10/09 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
python中列表和元组的区别
2017/12/18 Python
python使用Matplotlib画条形图
2020/03/25 Python
什么是Python中的匿名函数
2020/06/02 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
如何利用Python 进行边缘检测
2020/10/14 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
求职简历中个人的自我评价
2013/12/25 职场文书
银行求职信怎么写
2014/05/26 职场文书
社区安置帮教工作总结2015
2015/05/20 职场文书
礼仪培训心得体会
2016/01/22 职场文书
python 实现定时任务的四种方式
2021/04/01 Python