调用PrestaShop WebServices报count()参数错误的排查求助
这个问题我之前处理过好几次,核心原因几乎都是PHP版本升级带来的兼容性问题——结合你提到的「更换服务器后出现、旧服务器无此情况」的背景,给你整理了一步步的排查和解决思路:
1. 先确认新服务器的PHP版本
PHP 7.2及以后的版本对count()函数的参数校验变得严格了:旧版本(比如PHP 7.1及以下)会把非可数类型(比如null、字符串、标量值)默认当成0处理,不会抛出警告;但7.2+会直接抛出count(): Parameter must be an array or an object that implements Countable的警告。
你可以通过两种方式确认版本:
- 上传一个
phpinfo.php文件(内容为<?php phpinfo(); ?>)到服务器根目录,访问该文件查看PHP版本; - 如果有SSH权限,直接执行命令:
php -v。
如果新服务器PHP版本是7.2+,那基本锁定是版本兼容性问题。
2. 检查thirtybees/PrestaShop版本的兼容性
thirtybees是基于PrestaShop开发的,不同版本对PHP的支持范围不同:
- 比如thirtybees 1.0.x系列通常只支持到PHP 7.1;
- 1.1.x及以后的版本才开始适配PHP 7.2+。
如果你的系统版本过低,优先建议升级到官方最新稳定版——官方会修复这类PHP版本适配的问题,这是最稳妥的解决方式。
3. 临时代码修复(若暂时无法升级系统)
如果因为各种原因暂时不能升级系统,可以直接修改报错的文件:
找到/home/xyz/public_html/classes/webservice/WebserviceRequest.php的第927行,找到原来调用count()的代码,替换为兼容的写法:
// 替换原来的count($yourVariable)调用 $count = is_countable($yourVariable) ? count($yourVariable) : 0;
或者更严谨的兼容写法(适配PHP 7.1及更早版本,因为is_countable()是PHP 7.3才新增的):
$count = (is_array($yourVariable) || $yourVariable instanceof Countable) ? count($yourVariable) : 0;
⚠️ 注意:修改核心系统文件前一定要先备份,避免操作失误导致其他问题。
4. 检查服务器错误报告级别(可选,临时隐藏警告)
这不是根本解决办法,但如果只是不想看到警告信息,可以调整PHP的错误报告配置:
- 在服务器的
php.ini中设置:error_reporting = E_ALL & ~E_WARNING & ~E_NOTICE; - 或者在WebService相关的代码开头添加:
error_reporting(E_ALL & ~E_WARNING);。
但还是建议从根源解决兼容性问题,而不是隐藏警告。
5. 二次验证WebService配置
虽然客户说配置正常,但还是可以快速确认:
- WebService的密钥是否正确配置;
- 是否给该密钥分配了访问
categories资源的权限; - 新服务器的防火墙/安全组是否允许API请求的进出;
这些配置异常可能导致返回非预期的数据结构,间接触发count()的警告。
内容的提问来源于stack exchange,提问作者Dennis C

