我需要读取一个大文件来查找一些标签并创建一个动态表单。我无法使用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)。
答案 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作业和保存状态的数据库/文本文件自己实现基本文件。