快速开发一个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 常用字符串函数总结
Mar 15 PHP
关于使用coreseek并为其做分页的介绍
Jun 21 PHP
php上传文件中文文件名乱码的解决方法
Nov 01 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
smarty内置函数section的用法
Jan 22 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
Ajax和PHP正则表达式验证表单及验证码
Sep 24 PHP
php实现的http请求封装示例
Nov 08 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
Aug 24 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
详解php中的implements 使用
2017/06/13 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
不同浏览器的怪癖小结
2010/07/11 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
python求斐波那契数列示例分享
2014/02/14 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
python pytest进阶之fixture详解
2019/06/27 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
怎样声明接口
2014/09/19 面试题
介绍一下RMI的基本概念
2016/12/17 面试题
自我鉴定范文
2013/11/10 职场文书
大学学生会竞选稿
2015/11/19 职场文书
2016年中秋祝酒词
2015/11/26 职场文书
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers
nginx服务器的下载安装与使用详解
2021/08/02 Servers
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL