aliyunoss php8.*+ null值报错
前言
最近在使用阿里云的 OSS 服务时,发现了一些问题。
当php版本高于8.0的时候 src/OSS/SignerV1.php 中会出现 null 值错误。issue地址
目前已解决。各位更新 2.7.1 版本即可。
问题原因
line 17-20
1 | // Credentials information |
1 |
|
$token 是一个可选参数,当没有传入时,$token 的值是 null,所以在 SignerV1.php 中的 strlen($credentials->getSecurityToken()) 会报错。
line 25-27
1 | $queryString = parse_url($request->request_url, PHP_URL_QUERY); |
这3行代码目的是将url中的参数解析成数组,但是当url中没有参数时,parse_url 返回的是 null,parse_str 无法解析 null,所以会报错。
解决方案
只能修改源码,将 null 值的判断加上。
line 17-20
1 | // Credentials information |
line 25-27
1 | $queryString = parse_url($request->request_url, PHP_URL_QUERY); |
但是我个人比较好奇其他语言的源码是怎么写的,所以我去看了一下 java 的源码,发现 java 的源码中对 null 值的判断是有的。
下面是 java 对于 SecurityToken 的源码部分。1
2
3public String getSecurityToken() {
return securityToken;
}1
2
3public void setSecurityToken(String securityToken) {
this.securityToken = securityToken;
}1
2
3public boolean hasSecurityToken() {
return securityToken != null;
}
也就是说,在 SignerV1 中,获取 SecurityToken 的时候,会先判断 SecurityToken 是否为 null,如果不为 null 才会执行后续的操作。
但 php 的源码中没有对 null 值的判断,所以会报错。
总结
开猿节流的BUG



