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. 操作圖片后另存為另外一個新的圖片路徑
?
總結
以上是生活随笔為你收集整理的OSS: cURL error: Empty reply from server (52)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js中each的用法
- 下一篇: phpmailer的使用方法