下載代碼:
if (!file_exists($file_path)) {
mkdir($file_path, 0777, true);
}
$file = @fopen($file_path_and_name, 'w');
if (!$file) {
return "Error:無法創(chuàng)建文件。";
}
// 初始化cURL
$retry = 3;//重試3次
$ch = curl_init($url);
if (!$ch) {
fclose($file);
return "Error:無法初始化cURL。";
}
$headers = array(
"ID:".config('static.APPID'),
"APPKEY:".config('static.APPKEY'),
);
// 設(shè)置cURL選項(xiàng)
curl_setopt_array($ch, [
CURLOPT_FILE => $file,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT=>0,
CURLOPT_TIMEOUT_MS=>0,
CURLOPT_CONNECTTIMEOUT=>0,
CURLOPT_CONNECTTIMEOUT_MS=>0,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_NOPROGRESS=>false,
// CURLOPT_MAXFILESIZE=>9999999999,
//請求回調(diào)函數(shù) 大約每秒回調(diào)一次
CURLOPT_PROGRESSFUNCTION => function ($detail, $dltotal, $dlnow, $ultotal, $ulnow) use ($detail_id) {
Db::table("pm_mytask_detail")->where('id',$detail_id)->update(['file_size_now'=>$dlnow]);
},
]);
// 執(zhí)行請求并檢查結(jié)果
$success = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
// 清理資源
curl_close($ch);
// 關(guān)閉文件
fclose($file);
// 根據(jù)執(zhí)行結(jié)果處理
if ($success === false) {
unlink($file_path_and_name); // 刪除可能已部分寫入的文件
return "Error:" . $error;
}
if ($httpCode !== 200) {
unlink($file_path_and_name);
return "Error:下載失敗,HTTP狀態(tài)碼為 $httpCode";
}
Db::table("pm_gdp_mytask_detail")->where('id',$detail_id)->update(['download_state'=>'3']);
return "文件下載成功:" ;
一到了 2147476810 B 就停了, 就是2047.99MB ,這是什么原因? php緩存我已經(jīng)拉到最大4G了,還是不行,沒想到限制到底在哪?
PHP版本:如果PHP運(yùn)行在32位模式下,它可能無法處理超過2GB的文件。
cURL庫版本:某些版本的cURL在32位系統(tǒng)上可能有類似的限制。
操作系統(tǒng):如果服務(wù)器運(yùn)行在32位操作系統(tǒng)上,這也可能導(dǎo)致類似的問題。
linux是64位centos7.9 我看了 ,php也是64位我看了,但是這文件最后好像下載完成了,有2.1GB我看,但是curl的回調(diào)函數(shù)在2047MB的時(shí)候就斷了,后面沒執(zhí)行了,我后面換guzzle了,正常返回,正常結(jié)束了
if (!file_exists($file_path)) {
mkdir($file_path, 0777, true);
}
$headers = [
"ID"=>config('static.APPID'),
"APPKEY"=>config('static.APPKEY'),
];
try {
$pdfFileResource = fopen($file_path_and_name, 'w+');
$httpClient = new Client();
$response = $httpClient->get(
$url,
[
RequestOptions::SINK => $pdfFileResource,
'headers'=>$headers,
]
);
if ($response->getStatusCode() === 200) {
Db::table("pm_mytask_detail")->where('id',$detail_id)->update(['download_state'=>'3']);
return "下載成功:";
}
return "下載失敗";
} catch (\Throwable $e) {
return ($e->getMessage());
}
這樣用guzzle好像就OK了,2.1G正常下載完畢,只是不能像Curl那樣在函數(shù)里回調(diào),時(shí)刻抓到下載進(jìn)度了