在 Docker 中为 ThinkPHP 项目安装 PHP Redis 扩展并解决 500 错误

背景

今天在打开基于 ThinkPHP6 开发的网站时,遇到了 500 错误。经过排查,echo phpinfo(); 发现是 PHP 的 Redis 扩展未安装导致的。由于本地开发环境使用的是 Docker,且 Redis 服务已经在 Docker 中运行,因此需要为 PHP 容器安装 Redis 扩展。此外,ThinkPHP 配置文件中的 Redis 连接信息也需要调整为 Docker 中 Redis 容器的实际 IP 地址,否则会因连接失败而报错。


解决步骤
  1. 定位 Dockerfile

    我使用的是 DNMP(Docker + Nginx + MySQL + PHP)环境,PHP 的 Dockerfile 位于 dnmp/services/php/Dockerfile。为了安装 Redis 扩展,需要在 Dockerfile 中添加相关命令。

  2. 添加 Redis 扩展安装命令

    根据 PHP 版本,AI 提供了以下命令来安装 Redis 扩展:

    dockerfile 复制代码
    # Install Redis extension
    RUN apk add --no-cache autoconf gcc g++ make \
        && pecl install redis-5.3.7 \
        && docker-php-ext-enable redis \
        && apk del autoconf gcc g++ make

    这段命令的作用是:

    • 安装编译工具(autoconfgccg++make)。
    • 使用 pecl 安装指定版本的 Redis 扩展(redis-5.3.7)。
    • 启用 Redis 扩展。
    • 清理安装过程中使用的编译工具。
  3. 重新构建 PHP 容器

    在终端中进入 DNMP 项目目录,执行以下命令重新构建 PHP 容器:

    bash 复制代码
    cd /Users/mac/data/dnmp
    docker-compose build php
    docker-compose up -d
  4. 检查 Redis 扩展是否安装成功

    使用以下命令进入 PHP 容器并检查 Redis 扩展是否已安装:

    bash 复制代码
    docker exec -it php php -m | grep redis

    如果输出 redis,说明扩展安装成功。

  5. 重启 PHP 容器

    最后,重启 PHP 容器以确保配置生效:

    bash 复制代码
    docker-compose restart php

修改 ThinkPHP 配置文件中的 Redis 连接信息

在 Docker 环境中,Redis 服务的 IP 地址通常不是 127.0.0.1,而是 Docker 分配给 Redis 容器的内部 IP 地址。因此,在 ThinkPHP 的配置文件中,需要将 Redis 的连接信息从 127.0.0.1 修改为 Docker 中 Redis 容器的实际 IP 地址。


1. 获取 Docker 中 Redis 容器的 IP 地址

首先,使用以下命令查看 Redis 容器的 ID:

bash 复制代码
docker ps | grep redis

输出示例:

复制代码
123456789abc   redis:latest   "docker-entrypoint.s..."   2 hours ago   Up 2 hours   6379/tcp   my_redis

其中,123456789abc 是 Redis 容器的 ID。

接着,使用以下命令查看 Redis 容器的详细信息,包括其 IP 地址:

bash 复制代码
docker inspect <redis容器ID>

在输出中,找到 NetworkSettings 部分,查看 IPAddress 字段。例如:

json 复制代码
"NetworkSettings": {
    "Networks": {
        "bridge": {
            "IPAddress": "172.20.0.3",
            ...
        }
    }
}

这里的 172.20.0.3 就是 Redis 容器的 IP 地址。


2. 修改 ThinkPHP 配置文件

在 ThinkPHP 项目中,找到 Redis 的配置文件(通常是 config/cache.phpconfig/database.php),将 hostport 修改为 Docker 中 Redis 容器的 IP 地址和端口。

例如:

php 复制代码
// 驱动方式
'type'   => 'redis',
// 服务器地址
'host'   => '172.20.0.3',
// 端口
'port'   => 6379,

如果你在代码中直接连接 Redis,也需要修改连接信息:

php 复制代码
$redis = new Redis();
$redis->connect('172.20.0.3', 6379);

3. 注意事项
  • 如果 Redis 容器使用的是 host 网络模式,它将直接使用宿主机的网络栈,此时可以使用 127.0.0.1 作为 IP 地址。
  • 如果 Redis 容器映射了端口(例如 -p 6379:6379),你可以通过宿主机的 IP 和端口访问 Redis,而不需要关心容器内部的 IP。

4. 验证连接

修改配置后,重启 ThinkPHP 项目,并检查日志以确保 Redis 连接成功。如果一切正常,500 错误应该会消失,网站可以正常运行。


结果验证

完成以上步骤后,重新访问 ThinkPHP 网站,500 错误消失,网站正常运行。通过日志确认 Redis 连接已成功建立。


总结

在 Docker 环境中为 PHP 安装扩展时,需要修改 Dockerfile 并重新构建容器。同时,ThinkPHP 配置文件中的 Redis 连接信息也需要调整为 Docker 中 Redis 容器的实际 IP 地址。通过以上步骤,成功解决了 ThinkPHP 项目因 Redis 扩展缺失和连接配置错误导致的 500 错误。如果你也遇到类似问题,可以按照本文的方法尝试解决。


小提示:

  • 如果你使用的是不同版本的 PHP,可能需要调整 pecl install redis-5.3.7 中的 Redis 版本号。(这一部分都请AI帮忙即可)
  • 在修改 Dockerfile 后,记得重新构建容器并重启服务。

希望这篇博文对你有帮助!如果有其他问题,欢迎留言讨论。

相关推荐
陕西企来客1 小时前
2026 西安 GEO 优化技术解析:前沿技术与行业规范深度企来客科技行业白皮书声明
开发语言·搜索引擎·php
淘矿人1 小时前
DeepSeek V4对决Claude 4.8:AI模型终极横评
java·开发语言·人工智能·python·sql·php·pygame
木雷坞2 小时前
Docker Hub、GHCR、Quay 混在一起后,镜像源要分开测
运维·docker
qq_452396232 小时前
第十五篇:《Docker 与 Kubernetes 集成:从 Swarm 到 K8s 的迁移》
docker·容器·kubernetes
lpfasd1233 小时前
docker中默认网络的作用和注意事项
网络·docker·容器
我叫张小白。3 小时前
Redis BitMap实现用户签到功能
数据库·redis·缓存·fastapi
EntyIU3 小时前
DOCKER_CHEATSHEET
运维·docker·容器
颜淡慕潇3 小时前
低成本搭建鸿蒙PC运行环境:基于 Docker 的 x86_64 服务器
服务器·docker·harmonyos
cfm_29143 小时前
Redis高并发多级缓存介绍 + JDHotkey热点探测了解
数据库·redis·缓存
SilentSamsara3 小时前
Python 与 Docker:多阶段构建、最小镜像与健康检查
运维·开发语言·python·docker·中间件·容器