1. 如何修改 PHP 容器的 php.ini
并永久生效?
想象一下,你在一家咖啡店:
- 你需要调整咖啡机(PHP)的设置(如温度或浓度),但这些设置存储在一个特殊的文件(
php.ini
)中。 - 在 Docker 中,PHP 容器就像这台咖啡机,我们可以通过以下步骤修改它的配置文件并确保永久生效。
(1) 具体步骤
-
找到
php.ini
文件的位置- 默认情况下,
php.ini
文件位于容器内的某个路径,例如/usr/local/etc/php/php.ini
。 - 使用以下命令进入容器查看实际路径:
输出会告诉你docker exec -it <container_name> bash php --ini
php.ini
的加载路径。
- 默认情况下,
-
创建自定义配置文件
- 在宿主机上创建一个新的配置文件,比如
custom-php.ini
。 - 示例内容:
upload_max_filesize = 64M post_max_size = 64M max_execution_time = 300
- 在宿主机上创建一个新的配置文件,比如
-
将自定义配置文件挂载到容器
- 修改
docker-compose.yml
或docker run
命令,将宿主机上的配置文件挂载到容器内的指定路径。 - 示例(
docker-compose.yml
):version: '3' services: php: image: php:8.1-fpm volumes: - ./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini
- 示例(
docker run
):docker run -v $(pwd)/custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini php:8.1-fpm
- 修改
-
重启容器
- 修改完成后,重启容器以使更改生效:
或者:docker-compose down docker-compose up -d
docker restart <container_name>
- 修改完成后,重启容器以使更改生效:
-
验证配置是否生效
- 进入容器运行以下命令,检查配置是否已更新:
如果输出显示docker exec -it <container_name> php -i | grep upload_max_filesize
upload_max_filesize => 64M
,说明配置生效了。
- 进入容器运行以下命令,检查配置是否已更新:
2. 使用场景是什么?
(1) 自定义 PHP 配置
- 场景:需要调整 PHP 的核心配置,如上传文件大小、脚本执行时间等。
- 示例:
- 调整
upload_max_filesize
和post_max_size
以支持大文件上传。 - 调整
max_execution_time
以支持长时间运行的脚本。
- 调整
(2) 多环境一致性
- 场景:在开发、测试和生产环境中保持一致的 PHP 配置。
- 示例:
- 将
php.ini
文件版本控制到 Git 仓库中,确保所有环境加载相同的配置。
- 将
(3) 动态扩展功能
- 场景:通过自定义配置启用或禁用某些 PHP 扩展。
- 示例:
- 启用
opcache
以提高性能:opcache.enable=1 opcache.memory_consumption=128
- 启用
(4) 调试与优化
- 场景:在调试过程中临时修改配置,快速定位问题。
- 示例:
- 设置
display_errors=On
以便查看错误信息。
- 设置
3. 底层原理是什么?
(1) PHP 配置加载机制
-
默认配置文件:
- PHP 在启动时会加载默认的
php.ini
文件,通常位于/usr/local/etc/php/php.ini
。 - 可以通过
php --ini
查看实际加载的配置文件路径。
- PHP 在启动时会加载默认的
-
额外配置目录:
- PHP 支持从额外的目录加载配置文件(通常是
conf.d
目录下的.ini
文件)。 - 示例路径:
/usr/local/etc/php/conf.d/
- 挂载到这个目录的文件会被自动加载。
- PHP 支持从额外的目录加载配置文件(通常是
(2) Docker 的卷挂载机制
-
宿主机与容器共享文件:
- Docker 的
volumes
机制允许将宿主机的文件或目录挂载到容器中。 - 当宿主机上的文件发生变化时,容器内的文件也会同步更新。
- Docker 的
-
持久化配置:
- 通过挂载方式修改配置文件,即使容器被删除或重建,宿主机上的配置文件仍然存在,因此配置是“永久生效”的。
(3) 容器的隔离性
- 独立环境:
- 每个容器是一个独立的运行环境,修改一个容器的配置不会影响其他容器。
- 通过挂载自定义配置文件,可以为每个容器提供独立的 PHP 配置。
(4) PHP-FPM 的重新加载
- 动态应用配置:
- PHP-FPM 在接收到新的配置后会重新加载,无需完全重启容器。
- 示例:
(向 PHP-FPM 发送信号以重新加载配置)docker exec <container_name> kill -USR2 1
4. 图示说明
(1) 宿主机与容器的文件挂载
+--------------------------+
| 宿主机 | (custom-php.ini)
+--------------------------+
|
v
+--------------------------+
| 容器 | (/usr/local/etc/php/conf.d/custom-php.ini)
+--------------------------+
(2) PHP 配置加载流程
+--------------------------+
| 加载默认 php.ini | (/usr/local/etc/php/php.ini)
+--------------------------+
|
v
+--------------------------+
| 加载额外配置文件 | (/usr/local/etc/php/conf.d/*.ini)
+--------------------------+
|
v
+--------------------------+
| 合并配置并启动 PHP | (应用最终配置)
+--------------------------+
5. 总结
(1) 具体步骤
- 找到
php.ini
文件的位置。 - 创建自定义配置文件。
- 将自定义配置文件挂载到容器。
- 重启容器。
- 验证配置是否生效。
(2) 使用场景
- 自定义 PHP 配置。
- 多环境一致性。
- 动态扩展功能。
- 调试与优化。
(3) 底层原理
- PHP 配置加载机制:默认配置 + 额外配置文件。
- Docker 卷挂载机制:宿主机与容器共享文件。
- 容器隔离性:每个容器独立加载配置。
- PHP-FPM 重新加载:动态应用配置。