在 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 后,记得重新构建容器并重启服务。

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

相关推荐
ooseabiscuit30 分钟前
Laravel 8.x核心特性深度解析
php·laravel
摇滚侠37 分钟前
Redis 秒杀功能 超卖问题 一人一单问题 分布式锁 精彩!精彩!
redis·分布式·bootstrap
Emily呀6 小时前
【无标题】
redis
java资料站6 小时前
常用中间件快速搭建
docker·中间件
愈努力俞幸运6 小时前
function calling与mcp
android·数据库·redis
云游牧者6 小时前
K8S故障排查三板斧-CSDN博客
运维·docker·云原生·kubernetes·k8s·容器化·故障排查
IronMurphy7 小时前
Redis拷打第一讲
数据库·redis·缓存
楠枬7 小时前
Redis 事务
数据库·redis·缓存