zoukankan      html  css  js  c++  java
  • 使用C创建php扩展

    使用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");
    }
    

    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)."
    ";
    echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 0)."
    ";
    echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog')."
    ";
    echo strtolink('http://blog.csdn.net/fdipzone', '', 1)."
    ";
    echo strtolink('http://blog.csdn.net/fdipzone', '')."
    ";
    echo strtolink('http://blog.csdn.net/fdipzone', NULL, NULL)."
    ";
    
    ?>
    输出:

    <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>


  • 相关阅读:
    ThinkPHP函数详解:C方法
    ThinkPHP函数详解:A方法
    php中的中文字符串长度计算以及截取
    JQ $("#form1 :input" ).length 与 $("#form1input").length有什么区别?
    php中的isset和empty的区别与认识
    谈谈ACM带来的一些东西
    HDU 4374--F(x)
    奖学金
    数字排序
    查找数字
  • 原文地址:https://www.cnblogs.com/fdipzone/p/3715052.html
Copyright © 2011-2022 走看看