0

大きなファイルをダウンロードするための次のコードがありますが、ダウンロードを終了せずに毎回ダウンロードが停止します

function download($file)
{
    include('logger.php5');
    $log = new Logging();
    $log->lfile('download.log');
    ini_set('max_execution_time', 86400);
    //header('Location: '.$file);
    $filesize = filesize($file);
    $filename = pathinfo($file, PATHINFO_BASENAME);
    $filext = pathinfo($file, PATHINFO_EXTENSION);
    $mime = include('mime.php5');

    $log->lwrite(ini_get('max_execution_time'));
    $log->lwrite(sprintf('%s %s %s %s', $filename, $filext, $mime[$filext], human_filesize($filesize)));
    $log->lclose();
    @ob_end_clean();
    session_write_close();
    header("Content-Description: File Transfer");
    header("Content-Type: ".$mime[$filext]);
    header("Content-Disposition: ".
     (!strpos($HTTP_USER_AGENT,"MSIE 5.5")?"attachment; ":"").
     "filename=".$filename);
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".$filesize);
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header('Pragma: public');
    header('Expires: 0');
    $done = readfile_chunked($file);
}

function readfile_chunked($filename,$retbytes=true) { 
   $chunksize = 1*(1024*1024); // how many bytes per chunk 
   $buffer = ''; 
   $cnt =0; 
   // $handle = fopen($filename, 'rb'); 
   $handle = fopen($filename, 'rb'); 
   if ($handle === false) { 
       return false; 
   } 
   while (!feof($handle)) { 
       $buffer = fread($handle, $chunksize); 
       echo $buffer; 
       ob_flush(); 
       flush(); 
       if ($retbytes) { 
           $cnt += strlen($buffer); 
       } 
   } 
       $status = fclose($handle); 
   if ($retbytes && $status) { 
       return $cnt; // return num. bytes delivered like readfile() does. 
   } 
   return $status;
} 

スクリプトを呼び出すたびに、ダウンロードが開始されますが、400MB 後に停止します。ファイル自体のサイズは 778MB です。

誰かがコードの問題を見ることができますか?

アップデート

戻り値をログに記録しようとするとreadfile_chunked、ダウンロード自体ではなくスクリプトが停止したように感じます。readfile_chunked通話後にログエントリを取得できないためです。

4

1 に答える 1