使用C创建php扩展
2014-03-16 16:07
288 查看
使用C创建php扩展
优点:
1.提高运行效率。
2.降低php复杂度,可以直接调用扩展方法实现功能。
3.方便与第三方库交互。
缺点:
1.开发比php复杂。
2.可维护性降低。
3.开发周期变长。php开发,发现问题后,只要修复问题,即可见到效果。如果使用扩展,修复后需要重新编译,重启服务,才能见到效果。
首先,假定需要实现一个方法:将url字符串转换成超链接。
php实现方法:
现在使用C来做这个方法的扩展,开发php扩展需要使用ext_skel工具包,此工具包在php安装包的 /ext/ 中,例如:php-5.3.15/ext/ext_skel
1.创建 skel 文件,保存为
strtolink.skel
2.创建扩展框架
3.修改配置文件 config.m4
4.实现功能,修改strtolink.c,将PHP_FUNCTION(strtolink)这个方法修改为:
5.编译扩展
make 如果出现 error: ‘PHP_FE_END’ undeclared here (not in a function)
使用下面语句可解决,之后再重新编译
成功后在strtolink/modules 下找到strtolink.so 文件
6.添加扩展
将strtolink.so 复制到 php 扩展目录,可以通过phpinfo的 extension_dir 查看扩展目录位置
修改php.ini ,在最后添加 extension="strtolink.so"
重启动apache,phpinfo中会见到新扩展 strtolink
7.使用扩展
用回之前的php,只是把strtolink function 去掉便可。此方法已在扩展实现,可直接调用。
优点:
1.提高运行效率。
2.降低php复杂度,可以直接调用扩展方法实现功能。
3.方便与第三方库交互。
缺点:
1.开发比php复杂。
2.可维护性降低。
3.开发周期变长。php开发,发现问题后,只要修复问题,即可见到效果。如果使用扩展,修复后需要重新编译,重启服务,才能见到效果。
首先,假定需要实现一个方法:将url字符串转换成超链接。
php实现方法:
<?php function strtolink($url, $name='', $openwin=0){ $name = $name==''? $url : $name; $openwin = $openwin==1? ' target="_blank" ' : ''; return '<a href="'.$url.'" '.$openwin.'>'.$name.'</a>'; } echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 1); ?>
现在使用C来做这个方法的扩展,开发php扩展需要使用ext_skel工具包,此工具包在php安装包的 /ext/ 中,例如:php-5.3.15/ext/ext_skel
1.创建 skel 文件,保存为
strtolink.skel
string strtolink(string url, string name, int openwin)
2.创建扩展框架
./ext_skel --extname=strtolink --proto=strtolink.skel cd strtolink
3.修改配置文件 config.m4
将这10,11,12三行前面的 dnl 去掉 dnl PHP_ARG_WITH(strtolink, for strtolink support, dnl Make sure that the comment is aligned: dnl [ --with-strtolink Include strtolink support]) 即修改为: PHP_ARG_WITH(strtolink, for strtolink support, Make sure that the comment is aligned: [ --with-strtolink Include strtolink support])
4.实现功能,修改strtolink.c,将PHP_FUNCTION(strtolink)这个方法修改为:
PHP_FUNCTION(strtolink) { char *url = NULL; char *name = NULL; int argc = ZEND_NUM_ARGS(); int url_len; int name_len; long openwin = 0; char *opentag; char *result; if (zend_parse_parameters(argc TSRMLS_CC, "s|sl", &url, &url_len, &name, &name_len, &openwin) == FAILURE) return; if (name == NULL || strlen(name)==0){ name = url; } if (openwin == 1){ opentag = " target=\"_blank\" "; }else{ opentag = ""; } url_len = spprintf(&result, 0, "<a href=\"%s\" %s>%s</a>", url, opentag, name); RETURN_STRINGL(result, url_len, 0); php_error(E_WARNING, "strtolink: not yet implemented"); }
5.编译扩展
phpize sudo ./configure sudo make sudo make test
make 如果出现 error: ‘PHP_FE_END’ undeclared here (not in a function)
使用下面语句可解决,之后再重新编译
sed -i 's|PHP_FE_END|{NULL,NULL,NULL}|' ./strtolink.c sed -i 's|ZEND_MOD_END|{NULL,NULL,NULL}|' ./strtolink.c
成功后在strtolink/modules 下找到strtolink.so 文件
6.添加扩展
将strtolink.so 复制到 php 扩展目录,可以通过phpinfo的 extension_dir 查看扩展目录位置
sudo cp strtolink.so /usr/lib/php5/20090626/strtolink.so
修改php.ini ,在最后添加 extension="strtolink.so"
重启动apache,phpinfo中会见到新扩展 strtolink
7.使用扩展
用回之前的php,只是把strtolink function 去掉便可。此方法已在扩展实现,可直接调用。
<?php echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 1)."\r\n"; echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 0)."\r\n"; echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog')."\r\n"; echo strtolink('http://blog.csdn.net/fdipzone', '', 1)."\r\n"; echo strtolink('http://blog.csdn.net/fdipzone', '')."\r\n"; echo strtolink('http://blog.csdn.net/fdipzone', NULL, NULL)."\r\n"; ?>输出:
<a href="http://blog.csdn.net/fdipzone" target="_blank" >fdipzone blog</a> <a href="http://blog.csdn.net/fdipzone" >fdipzone blog</a> <a href="http://blog.csdn.net/fdipzone" >fdipzone blog</a> <a href="http://blog.csdn.net/fdipzone" target="_blank" >http://blog.csdn.net/fdipzone</a> <a href="http://blog.csdn.net/fdipzone" >http://blog.csdn.net/fdipzone</a> <a href="http://blog.csdn.net/fdipzone" >http://blog.csdn.net/fdipzone</a>
相关文章推荐
- 使用 Rust 创建 PHP 扩展
- 使用C创建php扩展
- 使用 Rust 创建 PHP 扩展
- php使用 DOM 创建xml文档
- 使用php创建一个Rest Api
- 关于php扩展中使用ini配置和使用全局变量
- Windows下Redis的安装及PHP扩展使用
- 如何使用PHP DOMDocument创建动态XML文件
- 使用 PHP脚本 创建数据库
- php opcode缓存的扩展xcache的使用
- 使用C语言来扩展PHP,写PHP扩展dll
- PHP 使用扩展 phdfs 操作 HDFS存储的文件
- 如何使用php创建留言板程序
- windows下php7.1安装redis扩展以及redis测试使用全过程
- linux环境下的PHP使用GTK扩展开发GUI图形界面
- PHP使用GD函数库创建水印图片+保存本地
- 使用PHP创建一个REST API(Create a REST API with PHP)
- 使用ADS 创建工程 http://www.softwarehistory.net/h/ARM_KaifaXiangjie/44.php
- php使用ffmpeg-php扩展库进行视频截图
- PHP使用mysql扩展操作数据库