请教关于 PHP foreach 长时间运行中断的一个问题

2018-03-26 00:06:08 +08:00
 swuhvxee

接触 PHP 不久,正在学习。现在碰到了这么一个问题。

有一批数据需要读取本地文件,并根据读取出来的每个 id 来请求 API 获取值,然后把值写入数据库。不可避免的用到了 foreach。

但是每次运行一会的时候,浏览器就提示 500---Internal Server Error 错误。php 代码也加上了 set_time_limit(0);ini_set('memory_limit', '-1')。

那么请问,这种情况是因为什么原因呢?是浏览器有默认的超时时间吗,脚本长时间不返回,浏览器就默认给超时了?还是因为超出了内存限制,给中断了?

大家碰到这种需要长时间处理大量数据的时候,是怎么解决的呢?因为是自学,所以没有人指点。有没有函数或者办法,可以解决以下 2 个问题。

1:浏览器超时(可能我描述不准确,但是说的就是浏览器获取不到返回值默认 500 )

2:这种循环太多了,内存肯定不够用的。那么是否可以随用随丢?

5019 次点击
所在节点    PHP
24 条回复
joeke
2018-03-26 18:43:21 +08:00
可以尝试一下 迭代器啊 ,占用内存小,再加一个 set_time_limit(0)
vincenttone
2018-03-26 18:54:55 +08:00
感觉楼主的应用是实时渲染,但是又有大量的 IO 请求。实际上可以做成异步,crontab 做个定时。
关于 foreach 的停止,可能是超时或者异常引起的,如果是 php7,可以用 try catch 捕获来防止这种问题。
如果数量非常多的话,可以考虑对文件内容做个分割,通过 fork 子进程来处理。
如果做成异步轻量级的应用,可以考虑用 redis 做个缓存或者直接文件缓存。
qce7
2018-03-27 09:18:41 +08:00
nginx 500,你看你现在连是哪行代码抛出异常都不清楚,就去优化,这难道不应该去开错误显示或者日志吗吗。。。
NowTime
2018-04-03 10:49:53 +08:00
命令行了解下,你这种效率太低了
写好代码,比如保存为 run.php
执行命令
php run.php

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/441331

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX