PHP 读取文件下载超时
PHP readfile download timing out
我的 PHP 脚本将 crashing/timing 排除在外,大概是因为读取文件。
我的目标是生成 zip,让用户下载,然后删除 zip。
代码:
<?php
if(isset($_POST['version']) && isset($_POST['items']) && isset($_POST['identifier'])) {
$identifier = $_POST['identifier'];
$version = $_POST['version'];
$tmp = dirname(__FILE__) . "/download/";
$zipfile = $tmp . $identifier . ".zip";
$name = "Program v" . $version . ".zip";
$path = dirname(__FILE__) . "\download\template\" . $version;
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path),
RecursiveIteratorIterator::LEAVES_ONLY
);
$zip = new ZipArchive();
if ($zip->open($zipfile, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
foreach ($files as $name => $file) {
// Skip directories (they would be added automatically)
if (!$file->isDir()) {
// Get real and relative path for current file
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($path) + 1);
//echo "adding " . $file . " as " . $relativePath;
// Add current file to archive
$zip->addFile($file, $relativePath);
}
}
$zip->close();
} else {
die('Error: Unable to create zip file');
}
// Stream the file to the client
header('Content-Type: application/zip');
header('Content-Length: ' . filesize($zipfile));
header('Content-disposition: attachment; filename="'.$name.'"');
readfile($zipfile);
exit;
}
一切正常,直到下载部分。 zip 文件在服务器上生成正常,当尝试下载它时,它崩溃了。
有时它会在我的日志中显示一个错误,告诉我它需要一个有效的路径并且给出了一个对象。即使它严格地输出一个字符串(路径)。
注意:文件小于 300 KiB,所以我非常怀疑网络服务器 运行 内存不足。
我很迷茫,非常感谢任何帮助。
问题出在 ZIP 文件的生成上。
addFile
方法需要一个文件 path 作为它的第一个参数,而不是一个对象。请参阅文档:
bool ZipArchive::addFile ( string $filename [, string $localname = NULL [, int $start = 0 [, int $length = 0 ]]] )
http://php.net/manual/en/ziparchive.addfile.php
因此,在您的情况下,正确的表达方式是:
$zip->addFile($filePath, $relativePath);
我的 PHP 脚本将 crashing/timing 排除在外,大概是因为读取文件。 我的目标是生成 zip,让用户下载,然后删除 zip。
代码:
<?php
if(isset($_POST['version']) && isset($_POST['items']) && isset($_POST['identifier'])) {
$identifier = $_POST['identifier'];
$version = $_POST['version'];
$tmp = dirname(__FILE__) . "/download/";
$zipfile = $tmp . $identifier . ".zip";
$name = "Program v" . $version . ".zip";
$path = dirname(__FILE__) . "\download\template\" . $version;
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path),
RecursiveIteratorIterator::LEAVES_ONLY
);
$zip = new ZipArchive();
if ($zip->open($zipfile, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
foreach ($files as $name => $file) {
// Skip directories (they would be added automatically)
if (!$file->isDir()) {
// Get real and relative path for current file
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($path) + 1);
//echo "adding " . $file . " as " . $relativePath;
// Add current file to archive
$zip->addFile($file, $relativePath);
}
}
$zip->close();
} else {
die('Error: Unable to create zip file');
}
// Stream the file to the client
header('Content-Type: application/zip');
header('Content-Length: ' . filesize($zipfile));
header('Content-disposition: attachment; filename="'.$name.'"');
readfile($zipfile);
exit;
}
一切正常,直到下载部分。 zip 文件在服务器上生成正常,当尝试下载它时,它崩溃了。
有时它会在我的日志中显示一个错误,告诉我它需要一个有效的路径并且给出了一个对象。即使它严格地输出一个字符串(路径)。
注意:文件小于 300 KiB,所以我非常怀疑网络服务器 运行 内存不足。
我很迷茫,非常感谢任何帮助。
问题出在 ZIP 文件的生成上。
addFile
方法需要一个文件 path 作为它的第一个参数,而不是一个对象。请参阅文档:
bool ZipArchive::addFile ( string $filename [, string $localname = NULL [, int $start = 0 [, int $length = 0 ]]] )
http://php.net/manual/en/ziparchive.addfile.php
因此,在您的情况下,正确的表达方式是:
$zip->addFile($filePath, $relativePath);