下载代码:
if (!file_exists($file_path)) {
mkdir($file_path, 0777, true);
}
$file = @fopen($file_path_and_name, 'w');
if (!$file) {
return "Error:无法创建文件。";
}
// 初始化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'),
);
// 设置cURL选项
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,
//请求回调函数 大约每秒回调一次
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]);
},
]);
// 执行请求并检查结果
$success = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
// 清理资源
curl_close($ch);
// 关闭文件
fclose($file);
// 根据执行结果处理
if ($success === false) {
unlink($file_path_and_name); // 删除可能已部分写入的文件
return "Error:" . $error;
}
if ($httpCode !== 200) {
unlink($file_path_and_name);
return "Error:下载失败,HTTP状态码为 $httpCode";
}
Db::table("pm_gdp_mytask_detail")->where('id',$detail_id)->update(['download_state'=>'3']);
return "文件下载成功:" ;
一到了 2147476810 B 就停了, 就是2047.99MB ,这是什么原因? php缓存我已经拉到最大4G了,还是不行,没想到限制到底在哪?
设置的是静态php的运行内存吗
php-cli.ini 的 memory_limit = 4096M ,也改了
有没有可能是系统限制文件大小就是2G?
PHP版本:如果PHP运行在32位模式下,它可能无法处理超过2GB的文件。
cURL库版本:某些版本的cURL在32位系统上可能有类似的限制。
操作系统:如果服务器运行在32位操作系统上,这也可能导致类似的问题。
linux是64位centos7.9 我看了 ,php也是64位我看了,但是这文件最后好像下载完成了,有2.1GB我看,但是curl的回调函数在2047MB的时候就断了,后面没执行了,我后面换guzzle了,正常返回,正常结束了
这样用guzzle好像就OK了,2.1G正常下载完毕,只是不能像Curl那样在函数里回调,时刻抓到下载进度了