來源:轉載 發(fā)布時間:2018-12-13 15:27:23 閱讀量:860
一般而言,php速度已經比較快,但是,對于一些較高級開發(fā)者而言,如果想要追求更快的速度,那毫無疑問可以通過自己寫c代碼,并編譯為動態(tài)鏈接庫(常為.so文件),然后php通過創(chuàng)建一個新的擴展(extension),并在擴展里調用該.so文件,同時對外暴露出php函數接口。
在實際使用中,只要調用該函數接口,即可使用底層更快速的c函數服務。
一、動態(tài)鏈接庫(shared)
動態(tài)鏈接庫的文件名后綴通常是 ".so"。在Windows系統(tǒng)中,其文件名后綴是".dll"。
程序如果是和動態(tài)連接庫進行鏈接(link),程序運行時需要能夠找到相應的動態(tài)鏈接庫文件。
使用動態(tài)鏈接庫存編譯的程序在運行時要求用戶的機器上必需也安裝了相應的動態(tài)鏈接庫文件,這些庫文件需要放置在特定的目錄,以讓程序能夠加載這些庫。
雖然這似乎沒有使用靜態(tài)鏈接庫的程序使用方便,但卻減少了程序的大小。對于那些會被很多程序使用到的庫,使用動態(tài)鏈接的好處就更加明顯了。
動態(tài)鏈接庫的制作:
1 |
|
選項-fPIC在AMD64上是必須的,其它平臺是則不是必要選項。
包含靜態(tài)鏈接庫到動態(tài)鏈接庫中
編譯動態(tài)鏈接庫時,如果需要鏈接靜態(tài)庫,并把鏈接庫的內容包含到要編譯的動態(tài)庫中,可以使用選項-Wl,--whole-archive。
例如:
1 2 |
|
上面的-Wl表示傳遞給linker(鏈接器)。
二、調用動態(tài)C/C++鏈接庫
下面,本文的開發(fā)環(huán)境背景是CentOS release 6.5 。為了能夠調用c庫,我們的php 5.6.9,apache 2.4均是下載源碼并編譯的,不可直接通過yum安裝!請注意。至于php和apache的源碼編譯本文不提,只要注意在configure打開合適開關即可。
具體步驟如下:
將共享庫.so添加入系統(tǒng)配置中(假設共享庫名為 'libhello.so')
1 2 3 |
|
在php/ext目錄下創(chuàng)建擴展頭文件,取名為myfunctions.def
在該文件里填寫c函數聲明即可。每個函數一行。
1 2 |
|
使用ext_skel搭建擴展骨架
1 |
|
打開config.m4 中的enable開關
1 2 |
|
上面把擴展骨架建立好了,下面重新配置php (下面是我個人配置文件,讀者需要結合自己情況修改)
1 2 |
|
記?。∫欢ㄔ谀┪布由?—enable-myfunctions 。這樣子才會被編譯進php中。
當擴展編譯進去了之后,就可以開始修改擴展里的myfunctions.c文件,在里面可以添加php->c的轉接函數,在轉接函數里可以調用.so內的函數。
比如要添加一個hello_add的php函數,里面可以調用c函數add(int a, int b)
a. 添加函數聲明
1 |
|
b. 添加php函數
1 |
|
注意,在該函數里,如果調用了.so文件里的接口函數,那么待會在make的時候,要指定所使用的.so共享庫,該共享庫必須完成第1步中添加到系統(tǒng)配置的操作。
如果調用了.so文件,那么要在php/Makefile中添加
1 2 3 |
|
每次修改完上面的c文件,都要重新make
1 2 |
|
重啟apache服務器
1 |
|
在phpinfo里可以看到新擴展,可以直接在php調用新擴展內的函數。