大文件下载如何不导致内存溢出

大文件下载如何不导致内存溢出

public function testDownload(){

        set_time_limit(0);

        //$file_name = 'live.mp4';

        // 打开文件

        $newf = fopen(storage_path('logs/').'video','wb');

        $logf = fopen(storage_path('logs/').'memory','wb');

        $url = 'http://minsheng.zmeng123.com/admin/Index/index.html';

        $fp = fopen($url, 'rb');

        $chunk_size = 300; // 3MB

        // 设置指针位置

      // fseek($fp, 0);

        // 开启缓冲区

        ob_start();

        // 分段读取文件

        while (!feof($fp)) {

            echo fread($fp, $chunk_size); //输出数据到php缓冲区

            $data = ob_get_contents(); //获取缓冲区中的内容

            fwrite($newf,$data);

            $log = memory_get_usage()."\n"; //记录内存使用情况

            fwrite($logf,$log);

            ob_clean(); //删除缓存区中的数据

            //ob_flush(); //刷新php缓冲区中的内容到服务器

          // flush(); //刷新web服务器缓冲区到客户端

          // sleep(1); // 每1秒 下载 2 MB

        }

        // 关闭缓冲区

        ob_end_clean();

        fclose($fp);

        fclose($newf);

        fclose($logf);

        exit();

    }

//通过每次读取固定的数据存到缓冲区,然后读取缓冲区的数据写入文件后清空缓冲区来达到控制使用内存大小的结果。让下载大文件数据时不会导致内存溢出。还可以通过sleep函数来限制下载的速率 

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。