同步发布在个人笔记[docker环境下php安装扩展步骤 以mysqli为例]( https://blog.lichenrobo.com/server-net/server-deploy/docker-php-ext/ )
1.0 前言
最近在折腾服务器的时候,希望一个 web 应用可以实现对数据库的操作,很容易就想到用 php 来实现,因为php 有方便的 mysql 数据库支持(php7 后应为 mysqli )。但是 run 的时候发现 docker 的 php-fpm 镜像生成的容器没有安装 mysqli
扩展,需要手动配置。故有此笔记。
php__6">2.0 php 扩展安装原理
PHP扩展实际上是用C语言编写的动态链接库,用以增强PHP的功能。所以安装 php 扩展就是布置例如 mysqli.so
这样的动态链接库文件,并告知 php 文件位置,使其能够找到就成功了。
那么很显然的一种方法就是下载 mysqli 的源码并编译,然后在 php.ini
中配置相关信息。(可见从源码安装还是挺方便的,apt 的安装方式是方便,但是配置起来不太自由。)
然而 docker 里 php-fpm
镜像是已经安装好的,我们最好在此基础上进行安装,并且进入容器内部不算很方便,有时我们希望可以通过 dockerfile
或者 docker compose
的方式直接搞定扩展的事情。docker 镜像为我们提供了这样方便的选择,那就是一系列自带的安装脚本:
docker-php-source
docker-php-ext-enable
docker-php-ext-install
docker-php-ext-configure
利用这些脚本我们就可以方便的配置 php 扩展,无需再去修改 php.ini
文件了;同时也使得我们可以通过 dockerfile
或者 docker compose
的方式在容器创建之初就配置好环境。
docker__php__18">3.0 docker 环境下 php 扩展安装
以进入容器的方式安装 mysqli
为例。
首先我们可以通过命令 docker exec -it php-fpm_container bash
进入容器内部,运行命令 php -m
查看已经安装配置过的扩展。
此时显然列表里面没有 mysqli
docker_php__22">3.1 docker php 容器扩展安装路径及原理
容器内和扩展安装有这么几个关键的文件路径
/usr/src/
存放 php 源码。在初始状态只有源码压缩包,安装过程会生成./php
源码文件夹。/usr/src/php/ext/
生成的源码文件夹里各种扩展的源码文件所在处,以mysqli
为例,源码就在/usr/src/php/ext/mysqli
路径下。/usr/local/lib/php/extensions/no-debug-non-zts-20xxxxxx
安装扩展后,生成的动态链接库文件所在的位置,php 需要知道这个位置以便调用扩展。/usr/local/bin
docker-php
扩展安装脚本文件所在处。
整个安装原理就是:
解压获得扩展源码 → 编译源码并把动态链接库文件放在指定位置 → 配置php文件使其成功链接库文件 。
docker_php__36">3.2 docker php 扩展脚本安装过程
Step 1 docker-php-source
虽然在容器内任意位置都可以运行这些脚本,但是我们还是去脚本所在的目录下看一下
$ cd /usr/local/bin
$ ls
docker-php-entrypoint docker-php-ext-enable docker-php-source pear pecl phar.phar php-config
docker-php-ext-configure docker-php-ext-install flask peardev phar php phpize
这里面就包含用到的所有脚本了。
第一步就是解压出所需的mysqli扩展源码。
$ docker-php-source extract
$ cd /usr/src
$ ls
php php.tar.xz php.tar.xz.asc
$ cd php/ext/
$ ls
... mysqli ...
进入路径 /usr/src/php/ext/
能看到 mysql
源码文件夹,第一步就完成了。
注:docker-php-source delete
可以删除源码文件夹。
Step 2 docker-php-ext-install
mysqli
扩展是 php 源码里面就有的扩展,所以我们执行完第一步就有源码了,对于小众一些的非自带源码,我们就需要手动把源码文件夹布置在 /usr/src/php/ext/
下,即可进行下一步。
$ docker-php-ext-install mysqli # 后面参数是扩展源码的目录名
$ php -m
[PHP Modules]
...
mysqli
...[Zend Modules]
查看已安装扩展,就已经能看到 mysqli
扩展了。
Step 3 docker-php-ext-enable
这个命令实际上在上一步 install 后已经自动运行过了,所以新安装的扩展无需运行此步。对于有时不需要有时需要的扩展,可以通过 enable
来使能扩展功能。
$ docker-php-ext-enable mysqli # 后面参数是扩展源码的目录名
实际意义可以类比为在 php.ini
文件中配置了相关扩展的功能。
Step 4 docker-php-ext-configure
当安装扩展的时候,如果需要自定义配置时,则可以在 docker-php-ext-install
后面使用。具体用法就看不同扩展的需求了。 mysqli
无需此步。
$ docker-php-ext-configure .........
安装完成。