在 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 小时前
Redis中6种缓存更新策略
redis·后端
码码哈哈0.02 小时前
2025最新:3分钟使用Docker快速部署Redis集群
redis·docker·容器
海尔辛2 小时前
学习黑客 MAC 地址深入了解
学习·macos·php
L_592 小时前
火影bug,未保证短时间数据一致性,拿这个例子讲一下Redis
redis·bug·springcloud
Q_Q19632884753 小时前
python小说网站管理系统-小说阅读系统
开发语言·spring boot·python·django·flask·node.js·php
秀才恶霸3 小时前
04-redis
数据库·redis·缓存
liyongjun63164 小时前
Redis实现分布式获取全局唯一自增ID的案例。
redis·分布式·全局唯一id
韩先超5 小时前
2022年8月,韩先超对中移信息进行微服务架构原理(Docker+k8s+DevOps+Go等)培训
docker·微服务·kubernetes·devops
码上飞扬5 小时前
深入理解 Docker 网络原理:构建高效、灵活的容器网络
docker
xbd_zc6 小时前
【Harbor v2.13.0 详细安装步骤 安装证书启用 HTTPS】
docker·harbor