如何利用C建设php扩展
副标题#e#
利用C建设php扩展
利益:
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");
}
本栏目
#p#副标题#e#
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 去掉便可。此要领已在扩展实现,可直接挪用。
01.<?php
02.
03.echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 1)."\r\n";
04.echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 0)."\r\n";
05.echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog')."\r\n";
06.echo strtolink('http://blog.csdn.net/fdipzone', '', 1)."\r\n";
07.echo strtolink('http://blog.csdn.net/fdipzone', '')."\r\n";
08.echo strtolink('http://blog.csdn.net/fdipzone', NULL, NULL)."\r\n";
09.
10.?>
输出:
<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>