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

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

相关推荐
YOU OU5 小时前
Redis基础常识与命令
数据库·redis·缓存
吳所畏惧9 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
赵丙双10 小时前
Redis 概率相关的数据类型
redis
码云数智-大飞13 小时前
PHP 接口开发规范:统一返回格式、异常处理与参数校验
开发语言·php
风曦Kisaki13 小时前
#企业级docker私有仓库构建:harbor仓库与阿里云镜像仓库
阿里云·docker·容器
期待着201314 小时前
docker 安装 ,在centos7.9
运维·docker·容器
dadaobusi14 小时前
仿真边界处理
开发语言·php
Y38153266214 小时前
SERP API + Redis 缓存层:4 种方案对比与选型
数据库·redis·缓存
骑上单车去旅行16 小时前
Docker Compose 命令完全指南:从构建到运维
docker·容器·eureka
微学AI16 小时前
内网穿透的应用-把飞牛NAS变成家庭录像中心:EasyNVR部署与远程回放实战
开发语言·php