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下显示对应的动态库的名称,则配置动态库成功!!!:

「学生党小白,如果有什么不对之处还望各位不吝赐教,资料中有我的邮箱,很期待能一起进步学到更多的知识!感谢!」

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