如何在lnmp环境下安装pecl_redis扩展并解决编译错误?

新手上路,请多包涵

新版安装pecl_redis失败,redis无法启用

cc -I. -I/tmp/redis-6.1.0 -I/tmp/redis-6.1.0/include -I/tmp/redis-6.1.0/main -I/tmp/redis-6.1.0 -I/usr/local/php-generic-8.2/include/php -I/usr/local/php-generic-8.2/include/php/main -I/usr/local/ph
p-generic-8.2/include/php/TSRM -I/usr/local/php-generic-8.2/include/php/Zend -I/usr/local/php-generic-8.2/include/php/ext -I/usr/local/php-generic-8.2/include/php/ext/date/lib -I/usr/local/php-generi
c-8.2/include/php/ext -DHAVE_CONFIG_H -g -O2 -D_GNU_SOURCE -DZEND_COMPILE_DL_EXT=1 -c /tmp/redis-6.1.0/redis.c -MMD -MF redis.dep -MT redis.lo -fPIC -DPIC -o .libs/redis.o
/tmp/redis-6.1.0/redis.c: In function 'zim_Redis_multi':
/tmp/redis-6.1.0/redis.c:1909:58: error: macro "strncmp" requires 3 arguments, but only 2 given
} else if (strncmp(resp, ZEND_STRL("+OK")) != 0) {
^
/tmp/redis-6.1.0/redis.c: In function 'redis_response_enqueued':
/tmp/redis-6.1.0/redis.c:2048:47: error: macro "strncmp" requires 3 arguments, but only 2 given
if (strncmp(resp, ZEND_STRL("+QUEUED")) == 0) {
^
/tmp/redis-6.1.0/redis.c: In function 'redis_sock_read_multibulk_multi_reply_loop':
/tmp/redis-6.1.0/redis.c:2072:44: error: macro "strncmp" requires 3 arguments, but only 2 given
strncmp(inbuf, ZEND_STRL("+OK")) != 0)
^
make: * [redis.lo] Error 1
mv: cannot stat '/usr/local/php-generic-8.2/lib/php/extensions/no-debug-non-zts-20220829/redis.so': No such file or directory

lnmp-4.0 环境DeepSeek安装扩展(pecl_redis),卸载扩展(no)失败。

扩展pecl_redis安装失败

阅读 810
avatarAI BotBETA

问题原因分析

编译错误源于 strncmp 参数数量不匹配(PHP 8.2 源码宏定义调整导致兼容性问题)。从错误日志看,ZEND_STRL 宏在 PHP 8.2 中展开后可能与旧版 pecl_redis 源码存在兼容性问题。


解决方案(分步骤)

1. 安装依赖库

确保 hiredis 和开发工具已安装:

yum install -y hiredis-devel
# 或 Debian/Ubuntu
apt install -y libhiredis-dev

2. 强制指定兼容版本

PHP 8.2 需要 pecl_redis >= 6.0.0,直接指定版本安装:

pecl install redis-6.0.0

3. 手动修复源码(如果仍报错)

若安装失败,手动下载源码并修复 strncmp 参数:

wget https://pecl.php.net/get/redis-6.0.0.tgz
tar zxvf redis-6.0.0.tgz
cd redis-6.0.0

修改以下文件中的代码:

  • 文件:redis.c

    • 找到所有类似 strncmp(resp, ZEND_STRL("+OK")) 的代码
    • 修改为 strncmp(resp, "+OK", 3) (手动添加第三个参数)

4. 重新编译安装

phpize
./configure
make && make install

5. 启用扩展

php.ini 中添加:

extension=redis.so

重启 PHP 服务:

lnmp php-fpm restart

验证是否成功

php -m | grep redis
# 应输出 "redis"

常见问题补充

  • 若报错 mv: cannot stat '.../redis.so':检查编译生成的 .so 文件路径,确认 make install 输出路径与 PHP 扩展目录一致。
  • LNMP 环境特殊配置:某些 LNMP 一键包可能隐藏 PHP 路径,使用绝对路径调用 phpize

    /usr/local/php-generic-8.2/bin/phpize
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题