PHP在fopen, write和fclose成功后读取不工作


PHP fread not working after successful fopen, write and fclose

现在是大清早,我只是不明白:

下面的代码可以工作,文件被放置在服务器上:

$filename = $ioid . "_" . time();
$fp = fopen("$filename.csv", "w+");
foreach ($csv as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);

但这不能直接工作(文件是105k):

$fp2 = fopen("$filename.csv", "r");
$output = fread($fp2, 1000000000000);
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=$filename.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo $output;
fclose($fp2);

没有内容被读取,也没有内容被打印到页面上。

我做错了什么?:)

您的问题是fread($fp2, 1000000000000)试图分配1 tb 大缓冲区来读取文件,并且显然达到了允许的内存限制,除非您在32位平台上整数溢出发生。这两种方法都行不通。

如果您想要快速地将整个文件读取到输出缓冲区,请使用readfile(),如下所示:

header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=$filename.csv");
readfile("$filename.csv")

下次一定要检查错误日志。

如果您不打算将结果文件存储在磁盘上,我建议您重新编写脚本以使用更安全的方法:

$fp = tmpfile(); // creates a handle for a temporary file with a unique name
foreach ($csv as $fields) {
    fputcsv($fp, $fields);
}
rewind($fp);
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=report.csv");
fpassthru($fp);
fclose($fp); // this removes the file

问题在fread参数。你的代码产生:

Warning: fread() [function.fread]: Length parameter must be greater than 0
例如,当将1000000000000更改为1000时,

可以工作。所以:这样使用:

$output = file_get_contents("filename.csv");
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=$filename.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo $output;