阅读文件的有效方法php

时间:2018-04-01 08:37:27

标签: php

目前我正在使用它来打开文件并逐行读取其内容

<?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运行的云服务器,如果我可以通过升级服务器电源解决问题,我可以这样做

2 个答案:

答案 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;几乎无关。输出它。