如何通过phpEnv安装多版本Redis,搭建完整的phpEnv环境?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1063个文字,预计阅读时间需要5分钟。
当然可以,请提供需要改写的原文内容,我将根据您的要求进行修改。
为什么 phpEnv 不能像切换 PHP 那样切换 Redis 版本
phpEnv 的设计目标是隔离不同 PHP 二进制(如 php-7.4.33、php-8.2.12),而 redis 扩展属于 PHP 的编译期依赖模块:一旦 PHP 编译完成,其加载的 redis.so 就已绑定到特定的 hiredis 头文件与 ABI。phpEnv 不干预扩展编译过程,也不维护多个 redis.so 的路径映射表。
常见误解是把 redis-server(服务端)和 php-redis(客户端扩展)混为一谈——前者可用 docker 或手动安装多个版本,后者必须与当前 PHP 版本重新编译适配。
- phpEnv 切换的是
php命令指向的二进制,不影响extension=redis.so加载哪个文件 - 你看到的“Redis 版本”,实际是
phpinfo()中redis扩展报告的版本号,由扩展源码中的PHP_REDIS_VERSION宏决定 - 若想在不同 PHP 版本下使用不同
redis扩展(比如 5.3.7 vs 6.0.2),需分别为每个 PHP 版本单独编译对应扩展
在 phpEnv 下为不同 PHP 版本编译指定 redis 扩展版本
操作本质是:进入某 PHP 版本的源码构建目录,用该版本的 phpize 和 ./configure 重编 redis 扩展。关键在于路径隔离和工具链匹配。
立即学习“PHP免费学习笔记(深入)”;
以 phpEnv 已安装 php-8.1.22 为例,安装 redis-6.0.2 扩展:
cd ~/.phpenv/sources/8.1.22 ./build/php/bin/phpize cd /path/to/redis-6.0.2 # 下载解压后的扩展源码目录 ../build/php/bin/phpize ./configure --with-php-config=../build/php/bin/php-config make && make install
完成后,redis.so 会生成在 ../build/php/lib/php/extensions/no-debug-non-zts-20210902/ 下,再在该 PHP 版本的 php.ini(通常是 ~/.phpenv/versions/8.1.22/etc/php.ini)中写入:
extension=redis.so
- 务必用对应 PHP 版本自带的
phpize和php-config,否则会出现undefined symbol: zend_new_interned_string类错误 - 扩展编译前确认系统已安装
hiredis-dev(Debian/Ubuntu)或hiredis-devel(CentOS/RHEL) - 若需多个 redis 扩展版本共存(如同时保留 5.3.7 和 6.0.2),只能靠不同 PHP 版本隔离,无法在单个 PHP 下热切换
快速验证 redis 扩展是否生效及版本
不要依赖 php -m | grep redis —— 它只说明模块已加载,不反映实际版本。应直接调用 PHP 函数获取运行时信息:
php -r "echo 'Version: ' . Redis::VERSION . PHP_EOL;"
如果报错 Class 'Redis' not found,说明扩展未启用或 extension_dir 路径错误;若提示 Call to undefined method Redis::VERSION,则可能是旧版扩展(redis 扩展 2.x 不支持该静态属性,需升级到 5.0+)。
-
Redis::getVersion()在较新扩展中已废弃,优先用Redis::VERSION常量 - 扩展版本 ≠
redis-server版本,两者完全独立;可通过redis-cli --version单独查服务端 - phpEnv 切换 PHP 后,务必执行
phpenv rehash并检查php --ini输出的配置文件路径是否正确
真正麻烦的地方不在命令怎么敲,而在于:每次新增一个 PHP 版本,就得重走一遍 redis 扩展编译流程;且一旦 hiredis 系统库升级(如从 1.0.0 升到 1.2.0),所有已编译的 redis.so 都可能因 ABI 不兼容而 segfault —— 这类底层链接问题,phpEnv 完全不感知,也无日志提示。
本文共计1063个文字,预计阅读时间需要5分钟。
当然可以,请提供需要改写的原文内容,我将根据您的要求进行修改。
为什么 phpEnv 不能像切换 PHP 那样切换 Redis 版本
phpEnv 的设计目标是隔离不同 PHP 二进制(如 php-7.4.33、php-8.2.12),而 redis 扩展属于 PHP 的编译期依赖模块:一旦 PHP 编译完成,其加载的 redis.so 就已绑定到特定的 hiredis 头文件与 ABI。phpEnv 不干预扩展编译过程,也不维护多个 redis.so 的路径映射表。
常见误解是把 redis-server(服务端)和 php-redis(客户端扩展)混为一谈——前者可用 docker 或手动安装多个版本,后者必须与当前 PHP 版本重新编译适配。
- phpEnv 切换的是
php命令指向的二进制,不影响extension=redis.so加载哪个文件 - 你看到的“Redis 版本”,实际是
phpinfo()中redis扩展报告的版本号,由扩展源码中的PHP_REDIS_VERSION宏决定 - 若想在不同 PHP 版本下使用不同
redis扩展(比如 5.3.7 vs 6.0.2),需分别为每个 PHP 版本单独编译对应扩展
在 phpEnv 下为不同 PHP 版本编译指定 redis 扩展版本
操作本质是:进入某 PHP 版本的源码构建目录,用该版本的 phpize 和 ./configure 重编 redis 扩展。关键在于路径隔离和工具链匹配。
立即学习“PHP免费学习笔记(深入)”;
以 phpEnv 已安装 php-8.1.22 为例,安装 redis-6.0.2 扩展:
cd ~/.phpenv/sources/8.1.22 ./build/php/bin/phpize cd /path/to/redis-6.0.2 # 下载解压后的扩展源码目录 ../build/php/bin/phpize ./configure --with-php-config=../build/php/bin/php-config make && make install
完成后,redis.so 会生成在 ../build/php/lib/php/extensions/no-debug-non-zts-20210902/ 下,再在该 PHP 版本的 php.ini(通常是 ~/.phpenv/versions/8.1.22/etc/php.ini)中写入:
extension=redis.so
- 务必用对应 PHP 版本自带的
phpize和php-config,否则会出现undefined symbol: zend_new_interned_string类错误 - 扩展编译前确认系统已安装
hiredis-dev(Debian/Ubuntu)或hiredis-devel(CentOS/RHEL) - 若需多个 redis 扩展版本共存(如同时保留 5.3.7 和 6.0.2),只能靠不同 PHP 版本隔离,无法在单个 PHP 下热切换
快速验证 redis 扩展是否生效及版本
不要依赖 php -m | grep redis —— 它只说明模块已加载,不反映实际版本。应直接调用 PHP 函数获取运行时信息:
php -r "echo 'Version: ' . Redis::VERSION . PHP_EOL;"
如果报错 Class 'Redis' not found,说明扩展未启用或 extension_dir 路径错误;若提示 Call to undefined method Redis::VERSION,则可能是旧版扩展(redis 扩展 2.x 不支持该静态属性,需升级到 5.0+)。
-
Redis::getVersion()在较新扩展中已废弃,优先用Redis::VERSION常量 - 扩展版本 ≠
redis-server版本,两者完全独立;可通过redis-cli --version单独查服务端 - phpEnv 切换 PHP 后,务必执行
phpenv rehash并检查php --ini输出的配置文件路径是否正确
真正麻烦的地方不在命令怎么敲,而在于:每次新增一个 PHP 版本,就得重走一遍 redis 扩展编译流程;且一旦 hiredis 系统库升级(如从 1.0.0 升到 1.2.0),所有已编译的 redis.so 都可能因 ABI 不兼容而 segfault —— 这类底层链接问题,phpEnv 完全不感知,也无日志提示。

