目前我正在使用它来打开文件并逐行读取其内容
<?php
$scriptText = "";
$file_handle = fopen("TestScript.cs","r");
while(!feof($file_handle)){
$line = fgets($file_handle);
$scriptText = $scriptText . $line;
}
fclose($file_handle);
$size = strlen($scriptText);
header('Content-type: text/html');
header("Content-length: $size");
echo $scriptText;
?>
对于文件< 1mb
,这是可以接受的,但我们假设我们有一个文件40mb
这只是放慢速度的方法
有更快的方法吗?
编辑:
为了澄清效率,我不希望执行时间超过30秒的超时限制。我可以增加执行时间,但我更倾向于减少时间而不是分配更多时间。
此外,我没有使用共享托管服务提供商,它是我使用apache / xampp运行的云服务器,如果我可以通过升级服务器电源解决问题,我可以这样做
答案 0 :(得分:3)
使用readfile()
将文件的内容直接读取到输出缓冲区
<?php
$file = "TestScript.cs";
header('Content-Length: '.filesize($file));
readfile($file);
?>
答案 1 :(得分:2)
@Sean Denny答案可能是最有效的方法,如果你需要做的就是将文件发送到输出。
但是如果您需要逐行访问文件,请说出于某种原因必须从文件中过滤或修改数据。您仍然可以改进原始问题代码。
$size = filesize();
//open output buffer
$output_handle = fopen('php://output', 'w');
$file_handle = fopen("TestScript.cs","r");
header('Content-type: text/html');
header("Content-length: $size");
while(!feof($file_handle)){
$line = fgets($file_handle);
$line = strtolower($line); //modify line, for examples sake
fwrite($output_handle, $line);
}
您可以使用php://output
直接写入输出缓冲区。这减少了您使用的内存量,因为每行都被读取,修改,吐出到输出缓冲区而不是存储在PHP中。
但是你仍然必须通过文件进行迭代,因此readfile
在你的情况下更好。我只是想举例说明如果由于某种原因仍需要访问文件的行数据,如何改进输出。
例如,我用它来输出CSV数据,我必须检查某些列数据以从下载中删除给定的行。 (它也是大约250MB的数据),除了我使用fgetcsv
进行阅读,但这与&#34;&#34;&#34;几乎无关。输出它。