Docker环境-安装PHP扩展

1.安装扩展简介
安装扩展是指在docker环境下,怎么给PHP安装扩展。

2.安装扩展方式
(1).通过pecl方式安装:PECL 是PHP官方的扩展库仓库,其网址是https://pecl.php.net/
(2).通过php 容器中自带的几个特殊命令来安装:这些特殊命令可以在Dockerfile中的RUN命令中进行使用。

3.PHP容器命令

(1) docker-php-source:此命令,实际上就是在PHP容器中创建一个/usr/src/php的目录,里面放了一些自带的文件而已。我们就把它当作一个从互联网中下载下来的PHP扩展源码的存放目录即可。事实上,所有PHP扩展源码扩展存放的路径: /usr/src/php/ext 里面。

# 1.格式
docker-php-source extract
docker-php-source delete

# 2.说明
* extract: 创建并初始化/usr/src/php目录
* delete : 删除/usr/src/php目录

# 3.案例:操作时要先进入PHP容器中进行操作
root@803cbcf702a4:/usr/src# ls -l
total 11896 #此时,并没有php目录
-rw-r--r-- 1 root root 12176404 Jun 28 03:23 php.tar.xz
-rw-r--r-- 1 root root 801 Jun 28 03:23 php.tar.xz.asc

root@803cbcf702a4:/usr/src# docker-php-source extract
root@803cbcf702a4:/usr/src# ls -l
total 11900 #此时,生产了php目录,里面还有一些文件,由于篇幅问题,就不进去查看了
drwxr-xr-x 14 root root 4096 Aug 9 09:01 php
-rw-r--r-- 1 root root 12176404 Jun 28 03:23 php.tar.xz
-rw-r--r-- 1 root root 801 Jun 28 03:23 php.tar.xz.asc

root@803cbcf702a4:/usr/src# docker-php-source delete
root@803cbcf702a4:/usr/src# ls -l
total 11896 #此时,将已创建 php 目录给删除了
-rw-r--r-- 1 root root 12176404 Jun 28 03:23 php.tar.xz
-rw-r--r-- 1 root root 801 Jun 28 03:23 php.tar.xz.asc

root@803cbcf702a4:/usr/src#

(2) docker-php-ext-enable:该命令用来启动PHP扩展,我们使用pecl安装PHP扩展时,默认是没有启动这个扩展的,如果想要使用这个扩展必须在php.ini这个配置文件中进行配置才能使用,而docker-php-ext-enable 这个命令则是自动来启动PHP扩展的,不需要去php.ini这个配置中去配置。

# 1.格式
docker-php-ext-enable 扩展名

# 2.案例
# 查看现有可以启动的扩展,可以先切换到/usr/local/lib/php/extensions/目录,再ls查看内容
root@517b9c67507a:/usr/local/etc/php# ls /usr/local/lib/php/extensions/no-debug-non-zts-20170718/
opcache.so redis.so sodium.so
root@517b9c67507a:/usr/local/etc/php#

# 查看redis扩展是否已经启动
root@517b9c67507a:/usr/local/etc/php# php -m | grep redis
root@517b9c67507a:/usr/local/etc/php#

# 启动redis扩展
root@517b9c67507a:/usr/local/etc/php# docker-php-ext-enable redis
# 启动 成功
root@517b9c67507a:/usr/local/etc/php# php -m | grep redis
redis
root@517b9c67507a:/usr/local/etc/php#

#说明,php容器中默认是没有php.ini配置文件的,加载原理如下所示

root@517b9c67507a:/usr/local/etc/php# php -i | grep -A 5 php.ini
Configuration File (php.ini) Path => /usr/local/etc/php
Loaded Configuration File => (none)
# 核心是 /usr/local/etc/php/conf.d 目录下的扩展配置文件
Scan this dir for additional .ini files => /usr/local/etc/php/conf.d
Additional .ini files parsed => /usr/local/etc/php/conf.d/docker-php-ext-redis.ini,
/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini

root@517b9c67507a:/usr/local/etc/php#

(3).docker-php-ext-install:用来安装并启动PHP扩展的。

# 1.格式
# "源码包"需要放在/usr/src/php/ext目录下;
# 默认情况下,PHP容器没有/usr/src/php这个目录,需要使用docker-php-source extract来生成;
# docker-php-ext-install安装的扩展在安装完成后,会自动调用docker-php-ext-enable来启动安装的扩展;
# 卸载扩展,直接删除/usr/local/etc/php/conf.d 对应的配置文件即可。
docker-php-ext-install "源码包目录名"

# 2.案例
# 卸载redis 扩展
root@803cbcf702a4:/usr/local# rm -rf /usr/local/etc/php/conf.d/docker-php-ext-redis.ini
root@803cbcf702a4:/usr/local# php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

root@803cbcf702a4:/usr/local#

#PHP容器默认是没有redis扩展的。所以我们通过docker-php-ext-install安装redis扩展

root@803cbcf702a4:/# curl -L -o /tmp/reids.tar.gz https://codeload.github.com/phpredis/phpredis/tar.gz/5.0.2

root@803cbcf702a4:/# cd /tmp
root@517b9c67507a:/tmp# tar -xzf reids.tar.gz
root@517b9c67507a:/tmp# ls
phpredis-5.0.2 reids.tar.gz
root@517b9c67507a:/tmp# docker-php-source extract
root@517b9c67507a:/tmp# mv phpredis-5.0.2 /usr/src/php/ext/phpredis

#检查移过去的插件源码包是否存在
root@517b9c67507a:/tmp# ls -l /usr/src/php/ext | grep redis
drwxrwxr-x 6 root root 4096 Jul 29 15:04 phpredis
root@517b9c67507a:/tmp# docker-php-ext-install phpredis

# 检查redis 扩展是否已经安装上
root@517b9c67507a:/tmp# php -m | grep redis
redis
root@517b9c67507a:/tmp#

(4).docker-php-ext-configure:该命令一般都是需要跟 docker-php-ext-install搭配使用的。它的作用就是,当你安装扩展的时候,需要自定义配置时,就可以使用它来帮你做到。

# 1.格式
docker-php-ext-configure 扩展名 自定义配置内容

# 2.案例
FROM php:7.1-fpm
RUN apt-get update \
# 相关依赖必须手动安装
&& apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
# 安装扩展
&& docker-php-ext-install -j$(nproc) iconv mcrypt \
# 如果安装的扩展需要自定义配置时
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd

4.安装扩展应用

(1).安装php核心拓展包:在docker中安装的php有一些核心的拓展包,他们一般放置在/usr/src/php/ext/目录下

# 进入php容器
docker exec -it php容器名称 /bin/bash

# 切换到核心拓展包存放目录
cd /usr/src/php/ext/

# 查看核心拓展包内容
dir

# 安装相关依赖(例子)
apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev

# 安装mysqli(例子)
docker-php-ext-install mysqli

# 退出php容器
exit

# 重启php容器
docker restart php容器名称

(2).安装PECL 扩展:因为一些扩展并不包含在 PHP 源码文件中,所有需要使用 PECL(PHP 的扩展库仓库,通过 PEAR 打包)。用 pecl install 安装扩展,然后再用官方提供的 docker-php-ext-enable 快捷脚本来启用扩展。PECL 扩展下载地址:https://pecl.php.net/

# 进入php容器
docker exec -it php容器名称 /bin/bash

# 安装相关依赖
apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev

# 安装swoole拓展
pecl install swoole-4.2.12

# 启用swoole拓展
docker-php-ext-enable swoole

# 退出php容器
exit

# 重启php容器
docker restart php容器名称


相关推荐

  • 获取指定目录下的所有图片信息

    1 获取指定目录下的所有图片信息// 获取指定目录下的所有图片信息 public function getImagesInfo($directory) { $images = []; // 创建递归目录迭代器 $iterator = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($directory, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY ); // 遍历目录中的每个文件 foreach (

  • Thinkphp各版本的PHP要求

    ThinkPHP 8.0:运行环境要求PHP8.0+,兼容PHP8.3ThinkPHP 6.1:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 6.0:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 5.1:运行环境要求PHP5.6+,兼容PHP8.0ThinkPHP 5.0:运行环境要求PHP5.4+,兼容PHP7.3

  • Thinkphp5.1路径常量

    1 配置文件位置根目录/config/template.php2 配置文件内容<?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK ]// +----------------------------------------------------------------------// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reser

  • Thinkphp5.0路径常量

    1 配置文件位置根目录/application/模块名/config.php2 配置文件内容<?php//配置文件return [ // 后台视图输出字符串内容替换 'view_replace_str' => [ '__PUBLIC__' => '/', '__STATIC__' => '/static', '__CONSOLE__' => '/static/console', '__CONSOLE_CSS__' => '/static/console/css', '__CONSOLE_IMAGES__' => '/static/console/ima

  • wp站点防止别人进行DDOS攻击

    1 简介wp站点防止别人进行DDOS攻击。2 配置位置位置:根目录/wp-config.php3 配置内容在【根目录/wp-config.php】文件的开头添加如下代码:if(strpos($_SERVER['REQUEST_URI'], 'xmlrpc.php') !== false){ $protocol = $_SERVER['SERVER_PROTOCOL'] ?? ''; if(!in_array($protocol, ['HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3'], true)){ $protocol = 'HTTP/1.0'; } hea

  • 只读属性

    1 只读属性简介只读属性的声明方式类似于普通属性,但需要使用 readonly 关键字。2 只读属性例子class Point { public readonly float $x; public readonly float $y; public function __construct(float $x, float $y) { $this->x = $x; $this->y = $y; }}$point = new Point(3.5, 2.8);echo $point->x; // 输出: 3.5echo $point->y; // 输出: 2.8// 下面的尝