使用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); ?>
1.建立 skel 文件,保存爲 strtolink.skel
string strtolink(string url, string name, int openwin)
./ext_skel --extname=strtolink --proto=strtolink.skel cd strtolink
將這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])
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
使用下面語句可解決,以後再從新編譯
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 文件
將strtolink.so 複製到 php 擴展目錄,能夠經過phpinfo的 extension_dir 查看擴展目錄位置
sudo cp strtolink.so /usr/lib/php5/20090626/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>