Linux中PHP鏈接擴展.so動態庫

前幾天的一個實驗中涉及到使用PHP將本地文件部署到雲端,但是具體的實現卻還是需要費一番手腳,在網上找到的資料很多都沒辦法解決我自己遇到的實際困難,因此記錄下來僅供參考。

1、初始

我使用的雲端服務器是CentOS7.6,PHP版本是PHP7.1.33(PHP7.3之後的版本(包含7.3)的.so文件的擴展方式和之前有區別,其中的./ext_skel文件被修改爲一個php文件且後面的參數也有所修改,具體的請閱讀其文檔說明)

安裝lnmp時我使用的是lnmp一鍵安裝腳本(因爲還蠻方便的,比起一個一個用代碼安裝方便很多),安裝代碼如下:

yum install screen

wget http://soft.vpser.net/lnmp/lnmp1.6.tar.gz -cO lnmp1.6.tar.gz && tar zxf lnmp1.6.tar.gz && cd lnmp1.6 && ./install.sh lnmp

選擇時我選擇的是MySQL5.5.62和PHP7.1.33;(不要選擇PHP7.3及以上版本,原因如上)

2、安裝完成之後在服務器上使用php -v查看自己對應的PHP版本,然後使用如下命令下載對應的PHP安裝包(直接修改對應的PHP版本號即可下載):

php -v

wget http://cn2.php.net/distributions/php-7.1.33.tar.gz

當然,如果下載速度過慢的話也可以在本地用瀏覽器打開wget後的網站下載,下載完成後使用scp命令將文件上傳到服務器中,scp命令使用方法如下:

scp 本地文件位置 user@ip:服務器存儲文件位置

其中user指服務器的用戶名,IP即服務器的公網IP,在本地的命令行中輸入即可(macOS)

3、以我們實驗的擴展so庫爲例(以下均是):

我們實驗要求使用flex&bison生成的so庫文件搭配PHP配置雲端計算器。本地生成的so庫名爲libmycalc.so,我們首先使用如下命令查看libmycalc.so的信息:

nm -A libmycalc.so

我們所要使用的calcpar前的狀態碼爲T即代表可以正常使用,然後我們就可以進行下一步配置;

4、我們將下載下來的PHP解壓縮然後在其目錄下進行擴展庫的鏈接:

tar -zxvf php-7.1.33.tar.gz

解壓縮以後我們將libmycalc.so動態庫複製到PHP的庫文件中:

cp libmycalc.so /usr/local/lib/

然後我們進入到PHP的擴展庫文件中:(注意PHP版本號對應的解壓縮出來的文件名不同)

cd php-7.1.33/ext/

ext即PHP鏈接動態庫的文件夾。然後我們想要將libmycalc.so中的calcpar函數鏈接爲calcprocess函數,我們在ext文件下使用vi fun.def創建一個文件,在其中輸入:(注意沒有分號)

int calcprocess()

然後我們完成了初期的配置,可以進行下一步。

5、生成所需的庫文件夾並進行簡單配置:

我們在ext文件之下使用如下命令創建calc文件夾並生成一些初始的配置:

./ext_skel --extname=calc --proto=fun.def --skel=./skeleton

其中./ext_skel即PHP中鏈接動態庫的自帶文件,後面的爲其參數,具體用處請自行百度即可。

然後我們使用cd calc進入calc文件中,使用vi calc.c對calc.c進行相應的一些更改使其與libmycalc.so相鏈接:

修改一:在頭文件中加入#include “libmycalc.h”(自己需要的頭文件,這一步是因爲我們的實驗中需要這個頭文件進行一些配置)

修改二:修改PHP_FUNCTION(calcprocess)函數內容如下:(即對應的函數名,可以自定義),這一步按需要修改,我的修改如下(僅供參考):

⚠️:上述僅以我們實驗中的需求爲例,在自己的配置過程中,這一步需要自己對相應的鏈接處的函數進行修改,至於.h頭文件有無均可,視自己的需求而決定!!

6、生成對應的.so擴展庫:

在上一步配置好的情況下,我們進行如下配置:

使用phpize生成配置文件

然後使用find / -name php-config查找出php-config的路徑,

最後使用 ./configure --with-php-config=剛纔查找出來的路徑

調用make LDFLAGS=-lmycalc進行編譯

使用make install進行安裝動態庫

phpize

find / -name php-config

./configure --with-php-config=剛纔查找出來的路徑

make LDFLAGS=-lmycalc

make install

然後我們可以看見生成calc.so庫及其位置:

然後我們進入該路徑,使用

ldd calc.so

查看該動態庫的鏈接狀態:我們可以發現其中libmycalc.so顯示not found,但是我們已經將其放入了/usr/local/lib文件庫中,可能是由於未刷新的原因,我們使用/sbin/ldconfig來刷新配置,在這之後我們再次使用ldd calc.so來查看鏈接情況即可發現此時鏈接問題得到解決;

7、 修改php.ini文件使其生效:

我們使用vi /usr/local/php/etc/php.ini來添加相應的配置使得calc生效:

我們在; extension_dir = "./"下面添加相應的路徑和文件:

在對應的位置添加兩行信息:

extionsion_dir = "生成的.so文件路徑"

extionsion = “文件名”

然後我們使用lnmp restart重啓(若不是使用lnmp一鍵安裝則需要手動重啓)

8、查驗

我們若是使用lnmp一鍵安裝的話,我們輸入服務器的IP地址會出現如下畫面:

然後我們點擊phpinfo,在其中下滑,若是在Configuration下顯示對應的動態庫的名稱,則配置動態庫成功!!!:

「學生黨小白,如果有什麼不對之處還望各位不吝賜教,資料中有我的郵箱,很期待能一起進步學到更多的知識!感謝!」

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章