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

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

相关推荐
Yasen^o2 小时前
Redis高可用
数据库·redis·缓存
小黑蛋学java5 小时前
redis 集群节点切换角色
redis
.生产的驴5 小时前
SpringBoot 接口限流Lua脚本接合Redis 服务熔断 自定义注解 接口保护
java·大数据·数据库·spring boot·redis·后端·lua
冯浩(grow up)7 小时前
macOS可视化桌面配置docker加速器
macos·docker·容器
Micheal_Dad8 小时前
在macOS的docker中如何安装及运行ROS2
macos·docker
wniuniu_8 小时前
Pow工作量证明是啥
开发语言·区块链·php
桥边驿语人9 小时前
使用Docker Desktop进行本地打包和推送
运维·docker·容器·本地打包
sondx11 小时前
mac安装浏览器闪退处理
运维·docker·容器
Jodie_Rao11 小时前
在 M1 芯片的 Mac 电脑上安装 Redis 可以通过 Homebrew 快速完成
数据库·redis·macos
JioJio~z12 小时前
网络基础-路由技术和交换技术以及其各个协议
网络·智能路由器·php