• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

foreach 嵌套循环 性能优化的问题

php 搞代码 4年前 (2022-01-25) 34次浏览 已收录 0个评论
文章目录[隐藏]

(有很多结构一样的产品表,表名不一样)先是一个循环产品表 查询每个产品表按条件筛选出来的产品。

然后再把得获取的产品循环一条一条的插入新建的一个表中。

刚开始的时候我用的两个foreach实现这个功能了,但是数据量太大了,一次执行的结果就是内存不够用,直接 504 Gateway Time-out 错误。数据库中只插入了1800多条数据,剩余的数据就没有插入了。

现在就是想寻求一种思路,怎么解决数据量太大,而内存不够用的问题?最好能给个demo。

¥本文来%源[email protected]搞@^&代*@码)网5搞gaodaima代码

回复内容:

(有很多结构一样的产品表,表名不一样)先是一个循环产品表 查询每个产品表按条件筛选出来的产品。

然后再把得获取的产品循环一条一条的插入新建的一个表中。

刚开始的时候我用的两个foreach实现这个功能了,但是数据量太大了,一次执行的结果就是内存不够用,直接 504 Gateway Time-out 错误。数据库中只插入了1800多条数据,剩余的数据就没有插入了。

现在就是想寻求一种思路,怎么解决数据量太大,而内存不够用的问题?最好能给个demo。

php-cgi 不适合干这种事情(执行时间限制等等)。

这种大量数据的操作放到线下去执行吧。比如用 php 命令去调用对应的 php 脚本。

还有就是分批操作:把大任务拆分成几个小任务,分批去执行。

密集的数据查询、更新类操作,应该放到数据库的存储过程中实现。
如果实时性要求较高,只能做异步处理了,自动创建一个后台任务执行,执行完成后执行回调操作。

php foreach的时候会把每个值复制一次。

foreach ($tbs as $tb) {    $rows = $tb->getRows();    foreach ($rows as $row) {        insert($row);    }}

上述代码中,第一层循环中,每次循环都会把$tbs中的一项复制出来,放在$tb里,当$tb里字段过多,就挂了。建议你用for试试,直接用 $tbs + 下标的形式操作

这种形式适合使用命令行操作。命令行是没有超时时间的

有个东西叫做迭代器


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:foreach 嵌套循环 性能优化的问题

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址