來(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 |
|
選項(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 |
|
上面的-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 |
|
在php/ext目錄下創(chuàng)建擴(kuò)展頭文件,取名為myfunctions.def
在該文件里填寫c函數(shù)聲明即可。每個(gè)函數(shù)一行。
1 2 |
|
使用ext_skel搭建擴(kuò)展骨架
1 |
|
打開(kāi)config.m4 中的enable開(kāi)關(guān)
1 2 |
|
上面把擴(kuò)展骨架建立好了,下面重新配置php (下面是我個(gè)人配置文件,讀者需要結(jié)合自己情況修改)
1 2 |
|
記??!一定在末尾加上 —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 |
|
b. 添加php函數(shù)
1 |
|
注意,在該函數(shù)里,如果調(diào)用了.so文件里的接口函數(shù),那么待會(huì)在make的時(shí)候,要指定所使用的.so共享庫(kù),該共享庫(kù)必須完成第1步中添加到系統(tǒng)配置的操作。
如果調(diào)用了.so文件,那么要在php/Makefile中添加
1 2 3 |
|
每次修改完上面的c文件,都要重新make
1 2 |
|
重啟apache服務(wù)器
1 |
|
在phpinfo里可以看到新擴(kuò)展,可以直接在php調(diào)用新擴(kuò)展內(nèi)的函數(shù)。
在線
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線溝通:
客服
熱線
7*24小時(shí)客服服務(wù)熱線
關(guān)注
微信
關(guān)注官方微信