中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中調用C/C++制作動態鏈接庫的案例

發布時間:2021-03-11 12:01:08 來源:億速云 閱讀:326 作者:小新 欄目:開發技術

小編給大家分享一下PHP中調用C/C++制作動態鏈接庫的案例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一般而言,php速度已經比較快,但是,對于一些較高級開發者而言,如果想要追求更快的速度,那毫無疑問可以通過自己寫c代碼,并編譯為動態鏈接庫(常為.so文件),然后php通過創建一個新的擴展(extension),并在擴展里調用該.so文件,同時對外暴露出php函數接口。
在實際使用中,只要調用該函數接口,即可使用底層更快速的c函數服務。

一、動態鏈接庫(shared)

動態鏈接庫的文件名后綴通常是 ".so"。在Windows系統中,其文件名后綴是".dll"。

程序如果是和動態連接庫進行鏈接(link),程序運行時需要能夠找到相應的動態鏈接庫文件。

使用動態鏈接庫存編譯的程序在運行時要求用戶的機器上必需也安裝了相應的動態鏈接庫文件,這些庫文件需要放置在特定的目錄,以讓程序能夠加載這些庫。

雖然這似乎沒有使用靜態鏈接庫的程序使用方便,但卻減少了程序的大小。對于那些會被很多程序使用到的庫,使用動態鏈接的好處就更加明顯了。

動態鏈接庫的制作:

gcc -shared -fPIC -o libmylib.so mylib.c  ; # 編譯成為shared library

選項-fPIC在AMD64上是必須的,其它平臺是則不是必要選項。

包含靜態鏈接庫到動態鏈接庫中

編譯動態鏈接庫時,如果需要鏈接靜態庫,并把鏈接庫的內容包含到要編譯的動態庫中,可以使用選項-Wl,--whole-archive。

例如:

gcc -shared -o libmylib.so -Wl,--whole-archive libmylib.a \
  -Wl,--no-whole-archive libother.a

上面的-Wl表示傳遞給linker(鏈接器)。

二、調用動態C/C++鏈接庫
下面,本文的開發環境背景是CentOS release 6.5 。為了能夠調用c庫,我們的php 5.6.9,apache 2.4均是下載源碼并編譯的,不可直接通過yum安裝!請注意。至于php和apache的源碼編譯本文不提,只要注意在configure打開合適開關即可。

具體步驟如下:
將共享庫.so添加入系統配置中(假設共享庫名為 'libhello.so')

 cp libhello.so /usr/local/lib
 echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
 /sbin/ldconfig

在php/ext目錄下創建擴展頭文件,取名為myfunctions.def
在該文件里填寫c函數聲明即可。每個函數一行。

 string hello(int a)
 int hello_add(int a, int b)

使用ext_skel搭建擴展骨架

./ext_skel --extname=myfunctions --proto=myfunctions.def

打開config.m4 中的enable開關

 PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support, 
 [ --enable-myfunctions        Include myfunctions support])

上面把擴展骨架建立好了,下面重新配置php (下面是我個人配置文件,讀者需要結合自己情況修改)

 ./buildconf --force  //生成新配置腳本
 './configure' '--prefix=/usr/local/php' '--with-libdir=lib64' '--enable-fpm' '--with-fpm-user=php-fpm' '--with-fpm-group=www--enable-mysqlnd' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--enable-opcache' '--enable-pcntl' '--enable-mbstring' '--enable-soap' '--enable-zip' '--enable-calendar' '--enable-bcmath' '--enable-exif' '--enable-ftp' '--enable-intl' '--with-openssl' '--with-zlib' '--with-curl' '--with-gd' '--with-zlib-dir=/usr/lib' '--with-png-dir=/usr/lib' '--with-jpeg-dir=/usr/lib' '--with-gettext' '--with-mhash' '--with-ldap' '--disable-fileinfo' '--with-config-file-path=/usr/local/php/etc' '--with-apxs2=/usr/local/httpd/bin/apxs' '--enable-myfunctions' // 配置

 記住!一定在末尾加上 —enable-myfunctions 。這樣子才會被編譯進php中。
當擴展編譯進去了之后,就可以開始修改擴展里的myfunctions.c文件,在里面可以添加php->c的轉接函數,在轉接函數里可以調用.so內的函數。
比如要添加一個hello_add的php函數,里面可以調用c函數add(int a, int b)
a. 添加函數聲明

PHP_FE(hello_add, NULL)

b. 添加php函數

PHP_FUNCTION(hello_add){ ... }

注意,在該函數里,如果調用了.so文件里的接口函數,那么待會在make的時候,要指定所使用的.so共享庫,該共享庫必須完成第1步中添加到系統配置的操作。
如果調用了.so文件,那么要在php/Makefile中添加

Extra_LDFLAG = -lhello //對應前面的libhello.so
Extra_libs = -lhello
(make clean)

每次修改完上面的c文件,都要重新make

make
make install

重啟apache服務器

httpd -k restart

在phpinfo里可以看到新擴展,可以直接在php調用新擴展內的函數。

以上是“PHP中調用C/C++制作動態鏈接庫的案例”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五大连池市| 依兰县| 黎川县| 榕江县| 长春市| 雅安市| 石狮市| 昭通市| 云霄县| 喜德县| 庆元县| 兴安县| 大余县| 乐昌市| 平陆县| 增城市| 镇江市| 六盘水市| 衡南县| 康保县| 新宾| 大冶市| 天津市| 额济纳旗| 石门县| 全州县| 浑源县| 依兰县| 胶南市| 永平县| 琼结县| 吐鲁番市| 襄汾县| 鸡东县| 巴彦县| 河东区| 平遥县| 深水埗区| 和龙市| 灵川县| 临武县|