无法运行Gearman Worker:undefined symbol: ZVAL_NEW_ARR问题求助
问题
已完成如下配置与验证:
- 系统安装Gearman,执行
php --info | grep gearman确认Gearman扩展已启用,libgearman版本为1.1.19.1+ds - 在
php.ini中添加配置extension=/usr/lib/php/20210902/gearman.so - 执行
lsof -i tcp:4730确认gearmand服务正常监听4730端口
但运行Gearman官方Worker示例代码时,触发以下错误:
php: symbol lookup error: /usr/lib/php/20210902/gearman.so: undefined symbol: ZVAL_NEW_ARR
Worker代码:
$worker= new GearmanWorker(); $worker->addServer(); $worker->addFunction("reverse", "my_reverse_function"); while ($worker->work()); function my_reverse_function($job) { return strrev($job->workload()); }
Client代码:
$client= new GearmanClient(); $client->addServer(); print $client->do("reverse", "Hello World!");
解决方案
错误原因
该错误是由于gearman.so扩展的编译版本与当前运行的PHP版本内核API不兼容导致的。ZVAL_NEW_ARR是PHP内核中的内部符号,PHP 7.x到8.x版本间的内核API存在变更,若Gearman扩展是基于旧版PHP API编译的,在新版PHP环境中就会出现符号未定义的问题。
修复步骤
确认当前PHP版本
执行命令查看PHP版本:php -v注:
/usr/lib/php/20210902/路径对应PHP 8.1的API版本,可确认当前PHP是否为8.1系列。移除当前不兼容的Gearman扩展
- 若通过包管理器安装,执行对应卸载命令(如Debian/Ubuntu系):
sudo apt remove php-gearman - 手动删除扩展文件:
sudo rm /usr/lib/php/20210902/gearman.so
- 若通过包管理器安装,执行对应卸载命令(如Debian/Ubuntu系):
重新编译安装适配当前PHP版本的Gearman扩展
推荐通过PECL安装,会自动适配当前PHP的内核API:- 安装编译依赖:
sudo apt-get install php-dev libgearman-dev - 安装Gearman扩展:
pecl install gearman - 安装完成后,按照终端提示在
php.ini中添加扩展配置(通常为extension=gearman.so,无需指定绝对路径,PHP会自动查找)。
- 安装编译依赖:
重启PHP服务
根据你的PHP运行环境执行重启命令,例如FPM模式:sudo systemctl restart php8.1-fpm验证并测试
再次执行php --info | grep gearman确认扩展正常加载,然后重新运行Worker和Client代码即可。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

