Docker部署PHP时Redis类找不到:extension_loaded返回true
解决Docker部署PHP时Redis扩展加载异常问题
问题现象
调用extension_loaded('redis')返回true,但运行代码时提示“Class "Redis" not found”。使用的Dockerfile如下:
FROM php:7.1.32-fpm-alpine3.10 ENV PHPREDIS_VERSION 5.2.2 RUN docker-php-source extract && \ curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz && \ tar xfz /tmp/redis.tar.gz && \ rm -r /tmp/redis.tar.gz && \ mv phpredis-$PHPREDIS_VERSION /usr/src/php/ext/redis && \ docker-php-ext-install redis ENTRYPOINT ["php-fpm"]
问题原因
phpredis 5.x版本对PHP 7.1的兼容性存在缺陷,默认编译配置未在全局命名空间注册Redis类,导致扩展虽加载成功但无法调用类。
解决方案
方案1:降级phpredis至兼容PHP7.1的稳定版
将phpredis版本改为4.3.0(该版本完全适配PHP7.1),修改后的Dockerfile如下:
FROM php:7.1.32-fpm-alpine3.10 ENV PHPREDIS_VERSION 4.3.0 RUN docker-php-source extract && \ curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz && \ tar xfz /tmp/redis.tar.gz && \ rm -r /tmp/redis.tar.gz && \ mv phpredis-$PHPREDIS_VERSION /usr/src/php/ext/redis && \ docker-php-ext-install redis ENTRYPOINT ["php-fpm"]
方案2:编译时指定兼容配置(可选)
若坚持使用phpredis 5.x,可在编译前添加配置参数强制启用全局命名空间支持,修改RUN指令:
RUN docker-php-source extract && \ curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz && \ tar xfz /tmp/redis.tar.gz && \ rm -r /tmp/redis.tar.gz && \ mv phpredis-$PHPREDIS_VERSION /usr/src/php/ext/redis && \ docker-php-ext-configure redis --enable-redis && \ docker-php-ext-install redis
验证方法
构建镜像后,进入容器执行以下命令验证:
- 检查扩展是否加载:
php -m | grep redis - 测试Redis类可用性:
php -r "new Redis();"
内容的提问来源于stack exchange,提问作者ash
相关产品推荐
相关产品推荐

