OSS: cURL error: Empty reply from server (52)

环境:

PHP7.2 、TP6、OSS-sdk

背景:

在项目中,有一个需求是上传图片,由于图片比较大,所以使用内部的一套压缩图片逻辑后,再上传到阿里云的oss文件存储服务中,于是碰到一个问题,上传图片卡了一会后oss底层就抛了一个 cURL error: Empty reply from server (52)出来

 

解决过程

一、定位问题所在

1. 一开始怀疑是阿里云oss的问题,于是联系阿里小二排查,在oss上的实时查询日志查询了一下,并没有找到对应图片的请求。阿里小二回复说没有记录日志说明请求还没到oss服务上, 并且排查了服务并没有问题, 需要在客户端查询一下代码逻辑

 

2. 经过进一步定位发现, 如果去除了图片压缩的代码逻辑就能够正常上传图片。但是图片压缩逻辑其实也没啥逻辑,也是PHP内置的那些函数:imagecreatetruecolor | imagecopyresampled  , 而且图片压缩完能够正常打开,说明图片没有问题,问题应该还在代码上面

3. 在排查所有可能后,最终采用抓包来分析数据,抓包后发现一个问题:

客户端上传数据到 24669 字节后,就一直停住了, 过了60s后,服务端连接超时,然后发送了FIN 主动断开连接

而从请求头来看,content-length的大小是 76201,这个大小刚好是那张图片压缩前的大小

压缩前的图片 (76201) :

 

压缩后的图片(24669) :

二. 发现问题

问题已定位出来,原因是执行了压缩后,再调用oss上传, 而在oss上传的header上面发现content-length还是图片压缩之前的大小,故需要查找为什么没有获取到最新的文件大小

经过翻看oss-sdk的底层代码后发现, 他这个值是调用php底层的filesize函数

于是查找PHP的函数帮助文档, 发现问题所在 !!

 

当使用 stat(),lstat() 或者任何列在受影响函数表(见下面)中的函数时,PHP 将缓存这些函数的返回信息以提供更快的性能。然而在某些情况下,你可能想清除被缓存的信息。例如如果在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险时,你需要清除文件状态缓存。这种情况下,可以用 clearstatcache() 函数来清除被 PHP 缓存的该文件信息。

最终问题出现在PHP的文件操作函数上,因为压缩图片的时候使用了文件操作函数,而到oss-sdk里面也又使用了一次, 导致获取的是缓存的结果

也因为我们压缩前和压缩后使用的是同一个图片路径 , 所以才导致这个坑能被我们给挖出来

总结

在使用PHP底层的文件操作函数时,如果同一个句柄操作同一张图片需要注意,可以有以下两种解决方案:

1. 操作前操作后获取图片的信息的中间,需要调用clearstatcache方法进行清除缓存

2. 操作图片后另存为另外一个新的图片路径

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值