每次远程下载大文件,一到2047.99MB就停止了,摸不着头脑

914739959

问题描述

下载代码:

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了,还是不行,没想到限制到底在哪?

643 4 0
4个回答

TM

设置的是静态php的运行内存吗

  • 914739959 2024-07-23

    php-cli.ini 的 memory_limit = 4096M ,也改了

小W

有没有可能是系统限制文件大小就是2G?

  • 暂无评论
Noah

PHP版本:如果PHP运行在32位模式下,它可能无法处理超过2GB的文件。
cURL库版本:某些版本的cURL在32位系统上可能有类似的限制。
操作系统:如果服务器运行在32位操作系统上,这也可能导致类似的问题。

  • 914739959 2024-07-23

    linux是64位centos7.9 我看了 ,php也是64位我看了,但是这文件最后好像下载完成了,有2.1GB我看,但是curl的回调函数在2047MB的时候就断了,后面没执行了,我后面换guzzle了,正常返回,正常结束了

914739959
       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那样在函数里回调,时刻抓到下载进度了

  • 暂无评论
×
🔝