在php中读取大文件(超过500mb)

时间:2012-11-28 15:30:35

标签: php readfile

我需要读取一个大文件来查找一些标签并创建一个动态表单。我无法使用file()file_get_contents()因为文件大小。 如果我使用以下代码逐行读取文件

set_time_limit(0);    
$handle = fopen($file, 'r');
    set_time_limit(0);
    if ($handle) {
        while (!feof($handle)) {
            $line = fgets($handle);
            if ($line) {            
             //do something.
            }
        }
    }

    echo 'Read complete';

我在Chrome中遇到以下错误:

  

错误101(net :: ERR_CONNECTION_RESET)

几分钟后发生此错误,因此常量max_input_time,我认为不是问题。(设置为60)。

3 个答案:

答案 0 :(得分:1)

您使用什么浏览器软件? Apache,nginx?您应该将最大接受文件上载设置为高于500MB的位置。此外,php.ini中的最大上传大小也应该大于500MB,我认为必须允许PHP生成大于500MB的进程。 (在你的php配置中查看)。

答案 1 :(得分:1)

设置内存限制ini_set("memory_limit","600M");,您还需要设置超时限制

set_time_limit(0);

答案 2 :(得分:0)

通常,在用户等待它们完成时,不应该执行长时间运行的进程。 我建议使用面向后台工作的工具来处理这类工作,并可以查询作业的状态(运行/完成/错误)。

我的第一个猜测是,由于超时,中间的某些东西会破坏连接。无论是Web服务器(PHP无法知道)的超时还是某些防火墙,它都无关紧要,PHP会收到关闭连接的信号并且脚本停止运行。您可以使用ignore-user-abort(true)来规避此行为,这与set_time_limit(0)一起应该可以解决问题。

需要注意的是,无论是什么导致连接中止仍然会这样做,尽管脚本仍然可以完成它的工作。一个非常恼人的副作用是这个脚本可能并行执行多次,而它们都没有完成。

同样,我建议使用一些后台任务来执行此操作,并建议最终用户(浏览器)的界面验证该任务的状态。您也可以通过cron作业和保存状态的数据库/文本文件自己实现基本文件。