我曾尝试使用zip php扩展程序下载多个大文件,但我没有成功,因为服务器总是超时。
$revfiles = $_POST['file'];
if(empty($revfiles))
{
echo("You didn't select any file.");
}
else
{
$zip = new ZipArchive();
$filename = $_SERVER['DOCUMENT_ROOT'] . "/tmp/test70.zip";
if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
exit("cannot open <$filename>\n");
}
$N = count($revfiles);
for($i=0; $i < $N; $i++)
{
if($zip->addFile($_SERVER['DOCUMENT_ROOT'] . "/" . $revfiles[$i], strrchr($revfiles[$i], "/"))!==TRUE){
//echo("ERROR");
}
}
$zip->close();
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=test70.zip");
header("Pragma: no-cache");
header("Expires: 0");
readfile("$filename");
exit;
}
[30-Dec-2015 12:32:17 Europe/Berlin] PHP Fatal error: Maximum execution time of 30 seconds exceeded in /.../file.php on line 37
[30-Dec-2015 16:38:29 Europe/Berlin] PHP Fatal error: Allowed memory size of 524288000 bytes exhausted (tried to allocate 660656128 bytes) in /.../file.php on line 43
有人知道用php下载多个大文件的另一种方法吗?
答案 0 :(得分:0)
看起来您需要更改内存和文件上传大小限制以及脚本执行时间。所有都可以在php.ini文件中更改,但我会通过脚本更改最大执行时间脚本,而不是为所有PHP请求更改它。
最长执行时间
更改执行时间可以通过两种方式完成(在脚本中)...
1)将下面的行放在脚本的顶部。这将允许脚本无限期运行。如果您想更精细地控制每个文件上传多长时间,请使用第二个建议。
<div class='printchatbox' id='printchatbox'></div>
<input type='text' name='fname' value="Kees" class='chatinput' id='chatinput'>
2)在循环中使用相同的行,而不是在脚本的开头,但是将秒数从0更改为要为每个文件下载的长度。这是有效的,因为set_time_limit()每次被调用时都会将执行时间重置为零。
因此,如果您想让每个文件都有30秒,那么您的循环将看起来像......
set_time_limit(0);
MEMORY&amp;最大文件大小
您应该更改三种设置:
如果您使用的网站主机无法访问php.ini文件,那么您可以在脚本或htaccess文件中更改这些内容(根据需要调整值)... < / p>
PHP文件
for($i=0; $i < $N; $i++)
{
set_time_limit(30);
if($zip->addFile($_SERVER['DOCUMENT_ROOT'] . "/" . $revfiles[$i], strrchr($revfiles[$i], "/"))!==TRUE){
//echo("ERROR");
}
}
.htaccess文件:
ini_set('upload_max_filesize', '64M');
ini_set('post_max_size', '64M');
ini_set('memory_limit', '32M');
如果您有权访问php.ini文件,只需更改那里的设置即可!
答案 1 :(得分:0)
您希望以块的形式传输文件。这是关于此问题的SO帖子:Download File to server from URL
file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));