使用C建立php扩展

使用C建立php扩展php

优势:apache

1.提升运行效率。框架

2.下降php复杂度,能够直接调用扩展方法实现功能。工具

3.方便与第三方库交互。url


缺点:spa

1.开发比php复杂。.net

2.可维护性下降。code

3.开发周期变长。php开发,发现问题后,只要修复问题,便可见到效果。若是使用扩展,修复后须要从新编译,重启服务,才能见到效果。blog


首先,假定须要实现一个方法:将url字符串转换成超连接ip

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>
相关文章
相关标签/搜索