亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

PHP中調(diào)用C/C++制作的動(dòng)態(tài)鏈接庫(kù)的教程_php技巧

來(lái)源:轉(zhuǎn)載 發(fā)布時(shí)間:2018-12-13 15:27:23 閱讀量:685

一般而言,php速度已經(jīng)比較快,但是,對(duì)于一些較高級(jí)開(kāi)發(fā)者而言,如果想要追求更快的速度,那毫無(wú)疑問(wèn)可以通過(guò)自己寫c代碼,并編譯為動(dòng)態(tài)鏈接庫(kù)(常為.so文件),然后php通過(guò)創(chuàng)建一個(gè)新的擴(kuò)展(extension),并在擴(kuò)展里調(diào)用該.so文件,同時(shí)對(duì)外暴露出php函數(shù)接口。
在實(shí)際使用中,只要調(diào)用該函數(shù)接口,即可使用底層更快速的c函數(shù)服務(wù)。

一、動(dòng)態(tài)鏈接庫(kù)(shared)

動(dòng)態(tài)鏈接庫(kù)的文件名后綴通常是 ".so"。在Windows系統(tǒng)中,其文件名后綴是".dll"。

程序如果是和動(dòng)態(tài)連接庫(kù)進(jìn)行鏈接(link),程序運(yùn)行時(shí)需要能夠找到相應(yīng)的動(dòng)態(tài)鏈接庫(kù)文件。

使用動(dòng)態(tài)鏈接庫(kù)存編譯的程序在運(yùn)行時(shí)要求用戶的機(jī)器上必需也安裝了相應(yīng)的動(dòng)態(tài)鏈接庫(kù)文件,這些庫(kù)文件需要放置在特定的目錄,以讓程序能夠加載這些庫(kù)。

雖然這似乎沒(méi)有使用靜態(tài)鏈接庫(kù)的程序使用方便,但卻減少了程序的大小。對(duì)于那些會(huì)被很多程序使用到的庫(kù),使用動(dòng)態(tài)鏈接的好處就更加明顯了。

動(dòng)態(tài)鏈接庫(kù)的制作:

1

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

選項(xiàng)-fPIC在AMD64上是必須的,其它平臺(tái)是則不是必要選項(xiàng)。

包含靜態(tài)鏈接庫(kù)到動(dòng)態(tài)鏈接庫(kù)中

編譯動(dòng)態(tài)鏈接庫(kù)時(shí),如果需要鏈接靜態(tài)庫(kù),并把鏈接庫(kù)的內(nèi)容包含到要編譯的動(dòng)態(tài)庫(kù)中,可以使用選項(xiàng)-Wl,--whole-archive。

例如:

1

2

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

  -Wl,--no-whole-archive libother.a

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

二、調(diào)用動(dòng)態(tài)C/C++鏈接庫(kù)
下面,本文的開(kāi)發(fā)環(huán)境背景是CentOS release 6.5 。為了能夠調(diào)用c庫(kù),我們的php 5.6.9,apache 2.4均是下載源碼并編譯的,不可直接通過(guò)yum安裝!請(qǐng)注意。至于php和apache的源碼編譯本文不提,只要注意在configure打開(kāi)合適開(kāi)關(guān)即可。

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

1

2

3

cp libhello.so /usr/local/lib

echo /usr/local/lib > /etc/ld.so.conf.d/local.conf

/sbin/ldconfig

在php/ext目錄下創(chuàng)建擴(kuò)展頭文件,取名為myfunctions.def
在該文件里填寫c函數(shù)聲明即可。每個(gè)函數(shù)一行。

1

2

string hello(int a)

int hello_add(int a, int b)

使用ext_skel搭建擴(kuò)展骨架

1

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

打開(kāi)config.m4 中的enable開(kāi)關(guān)

1

2

PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support,

[ --enable-myfunctions        Include myfunctions support])

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

1

2

./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 。這樣子才會(huì)被編譯進(jìn)php中。
當(dāng)擴(kuò)展編譯進(jìn)去了之后,就可以開(kāi)始修改擴(kuò)展里的myfunctions.c文件,在里面可以添加php->c的轉(zhuǎn)接函數(shù),在轉(zhuǎn)接函數(shù)里可以調(diào)用.so內(nèi)的函數(shù)。
比如要添加一個(gè)hello_add的php函數(shù),里面可以調(diào)用c函數(shù)add(int a, int b)
a. 添加函數(shù)聲明

1

PHP_FE(hello_add, NULL)

b. 添加php函數(shù)

1

PHP_FUNCTION(hello_add){ ... }

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

1

2

3

Extra_LDFLAG = -lhello //對(duì)應(yīng)前面的libhello.so

Extra_libs = -lhello

(make clean)

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

1

2

make

make install

重啟apache服務(wù)器

1

httpd -k restart

在phpinfo里可以看到新擴(kuò)展,可以直接在php調(diào)用新擴(kuò)展內(nèi)的函數(shù)。


標(biāo)簽: PHP
分享:
評(píng)論:
你還沒(méi)有登錄,請(qǐng)先