亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

php調用C代碼的實現方法

2020-03-22 19:15:46
字體:
來源:轉載
供稿:網友
在php程序中需要用到C代碼,應該是下面兩種情況:1 已有C代碼,在php程序中想直接用
2 由于php的性能問題,需要用C來實現部分功能針對第一種情況,最合適的方法是用system調用,把現有C代碼寫成一個獨立的程序。參數通過命令行或者標準輸入傳入,結果從標準輸出讀出。其次,稍麻煩一點的方法是C代碼寫成一個daemon,php程序用socket來和它進行通訊。重點講講第二種情況,雖然沿用system調用的方法也可以,但是想想你的目的是優化性能,那么頻繁的起這么多進程,當然會讓性能下降。而寫daemon的方法固然可行,可是繁瑣了很多。我的簡單測試,同樣一個算法,用C來寫比用php效率能提高500倍。而用php擴展的方式,也能提高90多倍(其中的性能損失在了參數傳遞上了吧,我猜)。所以有些時候php擴展就是我們的最佳選擇了。這里我著重介紹一下用C寫php擴展的方法,而且不需要重新編譯php。首先,找到一個php的源碼,php4或者php5版本的都可以,與你目標平臺的php版本沒有關系。在源碼的ext目錄下可以找到名為ext_skel的腳本(windows平臺使用ext_skel_win32.php)
在這個目錄下執行./ext_skel --extname=hello(我用hello作為例子)
這時生成了一個目錄 hello,目錄下有幾個文件,你只需要關心這三個:config.m4 hello.c php_hello.h把這個目錄拷備到任何你希望的地方,cd進去,依次執行
phpize
/configure
make
什么也沒發生,對吧?
這是因為漏了一步,打開config.m4,找到下面
dnl If your extension references something external, use with:
..
dnl Otherwise use enable:
..
這是讓你選擇你的擴展使用with還是enable,我們用with吧。把with那一部分取消注釋。
如果你和我一樣使用vim編輯器,你就會很容易發現dnl三個字母原來是表示注釋的呀(這是因為vim默認帶了各種html' target='_blank'>文件格式的語法著色包)我們修改了config.m4后,繼續
phpize
/configure
make
這時,modules下面會生成hello.so和hello.la文件。一個是動態庫,一個是靜態庫。你的php擴展已經做好了,盡管它還沒有實現你要的功能,我先說說怎么使用這個擴展吧!ext_skel為你生成了一個hello.php里面有調用示例,但是那個例子需要你把hello.so拷貝到php的擴展目錄中去,我們只想實現自己的功能,不想打造山寨版php,改用我下面的方法來加載吧:
復制代碼 代碼如下:
if(!extension_loaded("hello")) {
dl_local("hello.so");
}
function dl_local( $extensionFile ) {
//make sure that we are ABLE to load libraries06. if( !(bool)ini_get( "enable_dl" ) || (bool)ini_get( "safe_mode" ) ) {
die( "dh_local(): Loading extensions is not permitted./n" );
}
//check to make sure the file exists11. if( !file_exists(dirname(__FILE__) . "/". $extensionFile ) ) {
die( "dl_local(): File '$extensionFile' does not exist./n" );
}
//check the file permissions16. if( !is_executable(dirname(__FILE__) . "/". $extensionFile ) ) {
die( "dl_local(): File '$extensionFile' is not executable./n" );
}
//we figure out the path21. $currentDir = dirname(__FILE__) . "/";
$currentExtPath = ini_get( "extension_dir" );
$subDirs = preg_match_all( "http:////" , $currentExtPath , $matches );
unset( $matches );
//lets make sure we extracted a valid extension path27. if( !(bool)$subDirs ) {
die( "dl_local(): Could not determine a valid extension path [extension_dir]./n" );
}
$extPathLastChar = strlen( $currentExtPath ) - 1;
if( $extPathLastChar == strrpos( $currentExtPath , "/" ) ) {
$subDirs--;
}
$backDirStr = "";
for( $i = 1; $i = $subDirs; $i++ ) {
$backDirStr .= "..";
if( $i != $subDirs ) {
$backDirStr .= "/";
}
}
//construct the final path to load46. $finalExtPath = $backDirStr . $currentDir . $extensionFile;
//now we execute dl() to actually load the module49. if( !dl( $finalExtPath ) ) {
die();
}
//if the module was loaded correctly, we must bow grab the module name54. $loadedExtensions = get_loaded_extensions();
$thisExtName = $loadedExtensions[ sizeof( $loadedExtensions ) - 1 ];
//lastly, we return the extension name58. return $thisExtName;
}//end dl_local()

這樣的好處是你的php擴展可以隨你的php代碼走,綠色擴展。隨后一個讓人關心的問題是,如何添加函數、實現參數傳遞和返回值添加函數步驟如下:
php_hello.h:
PHP_FUNCTION(confirm_hello_compiled);// 括號里面填寫函數名hello.c
zend_function_entry hello_functions[] = {
PHP_FE(confirm_hello_compiled, NULL) /* 這里添加一行 */
{NULL, NULL, NULL} /* Must be the last line in hello_functions[] */
};
PHP_FUNCTION(confirm_hello_compiled)
{// 這里寫函數體
}
要實現的函數原型其實都一個樣,用宏PHP_FUNCTION來包裝了一下,另外呢,在hello_functions里面添加了一行信息,表示你這個模塊中有這個函數了。那么都是一樣的函數原型,如何區分返回值與參數呢?

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品成人动漫| 伊人男人综合视频网| 亚洲精品一区二区三区婷婷月| 在线电影av不卡网址| 日韩国产高清视频在线| 国产中文欧美精品| 国产97人人超碰caoprom| 亚洲欧美国内爽妇网| 亚洲人成在线观看网站高清| 久久久久久久久91| 精品呦交小u女在线| 欧美日韩国产激情| 成人免费福利视频| 久久91亚洲精品中文字幕奶水| 国产精品高潮呻吟视频| 国产精品久久久一区| 中文字幕欧美视频在线| 亚洲欧洲在线观看| 欧美日韩中文字幕在线视频| 欧美电影在线观看高清| 成人午夜一级二级三级| 国产成人免费91av在线| 欧美精品在线播放| 亚洲色图综合网| 亚洲欧洲av一区二区| 欧美高清在线视频观看不卡| 国产精品嫩草视频| 欧美人交a欧美精品| 欧美日韩中文字幕在线视频| 国产精品扒开腿做爽爽爽视频| 成人h猎奇视频网站| 91精品国产99| 日韩在线精品视频| 最好看的2019的中文字幕视频| 国产精品丝袜久久久久久高清| 精品久久久久久中文字幕大豆网| 米奇精品一区二区三区在线观看| 青青草国产精品一区二区| 色av吧综合网| 久久亚洲影音av资源网| 欧美在线性视频| 色悠久久久久综合先锋影音下载| 欧美中文字幕在线| 国产日韩欧美中文| 国产97在线|日韩| 亚洲激情电影中文字幕| 欧美精品videosex性欧美| 亚洲桃花岛网站| 97视频在线观看免费| 国产精品视频永久免费播放| 国内精品视频在线| www.日韩.com| 国产成人在线精品| 亚洲成人激情在线| 亚洲精品一区二区久| 国产98色在线| 久久激情五月丁香伊人| 国产女人18毛片水18精品| 亚洲免费一级电影| 668精品在线视频| 欧美精品第一页在线播放| 精品亚洲一区二区| 日韩日本欧美亚洲| 色中色综合影院手机版在线观看| 久久久国产视频91| 亚洲aⅴ日韩av电影在线观看| 久久视频免费在线播放| 日本高清视频一区| 中文字幕日韩欧美| 欧美午夜精品久久久久久浪潮| 久久精品美女视频网站| 91精品在线国产| 91成人国产在线观看| 国产精品亚洲欧美导航| 亚洲2020天天堂在线观看| 久久国产精品影片| 亚洲一区美女视频在线观看免费| 国产精品美女无圣光视频| 国产精品日韩在线| 亚洲伊人成综合成人网| 久久久久久网站| 国产日韩精品视频| 亚洲欧美在线第一页| 日本亚洲欧美成人| 久久亚洲春色中文字幕| 亚洲精品狠狠操| 国产精品久久久久久五月尺| 国模叶桐国产精品一区| 亚洲毛片在线免费观看| 日韩在线观看成人| 精品视频9999| 91chinesevideo永久地址| 欧美日韩一区二区在线播放| 欧美极品少妇与黑人| 成人黄色网免费| 中文字幕少妇一区二区三区| 亚洲精品免费在线视频| 91久久久久久久久久久久久| 国产色婷婷国产综合在线理论片a| 亚洲xxxx18| 日韩小视频网址| 国产精品爽黄69天堂a| 国产精品成人一区二区| 国产成人在线一区| 久久久久久国产精品三级玉女聊斋| 欧美日韩在线视频首页| 91久久久久久久| 国内免费久久久久久久久久久| 精品久久久香蕉免费精品视频| 国产日韩精品电影| 最近的2019中文字幕免费一页| 久久av资源网站| 中文字幕亚洲一区二区三区| 神马久久久久久| 国产乱肥老妇国产一区二| 成人在线激情视频| 亚洲一区二区少妇| 欧美福利视频在线观看| 成人看片人aa| 日韩在线视频观看| 91在线精品播放| 黄色一区二区在线| 日韩在线观看免费全集电视剧网站| 国产精品99久久久久久久久久久久| 亚洲精品色婷婷福利天堂| 久久久精品免费| 亚洲欧美在线免费| 久久精品国产91精品亚洲| 亚洲理论在线a中文字幕| 亚洲天堂网站在线观看视频| 日韩暖暖在线视频| 欧美精品一本久久男人的天堂| 欧美视频专区一二在线观看| 精品日本美女福利在线观看| 国产精品一区av| 亚洲www在线观看| 欧美一级视频免费在线观看| 成人黄色激情网| 国产精品亚洲精品| 亚洲国产精品99久久| 国产精品久久久av久久久| 日韩欧美在线网址| 亚洲精品久久久久久久久| 日韩在线欧美在线国产在线| 日韩一区视频在线| 精品高清美女精品国产区| 国产成人精品在线| 亚洲在线观看视频| 欧美激情区在线播放| 91久久久久久久久久| 亚洲jizzjizz日本少妇| 国产精品青草久久久久福利99| 伊人青青综合网站| 国产精品爽爽ⅴa在线观看| 国产精品久久久久av免费| 亚洲精品av在线| 久久99精品久久久久久噜噜| 精品免费在线观看| 668精品在线视频| 欧美午夜www高清视频| 亚洲综合在线播放| 有码中文亚洲精品| 亚洲aⅴ日韩av电影在线观看| 在线观看日韩www视频免费|