程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 如何使用C創建php擴展

如何使用C創建php擴展

編輯:關於C語言

使用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 去掉便可。此方法已在擴展實現,可直接調用。

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>
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved