为了账号安全,请及时绑定邮箱和手机立即绑定

当大量数据时 PHP 脚本内部服务器错误

当大量数据时 PHP 脚本内部服务器错误

PHP
繁花不似锦 2023-09-08 10:37:30
概括这是一个脚本(CakePHP 2.10.18 - 带 PHP 5.3 的 LAMP 专用服务器),它从2 个 MySQL 表加载信息,然后对数据进行一些处理以将其输出到 Excel。表 1 包含用户,表 2 包含有关这些用户的信息(每个用户一条记录)。该脚本的目标是从表 1 中获取用户的记录,从表 2 中获取其相关信息,并将其放入 Excel 行中(为此使用PHPExcel_IOFactory库)。这些表中提取的信息约为 8000 条记录,表本身分别有 100K 和 300K 总记录。这些表中的所有字段都是整数和小varchar,除了第二个表中的一个字段(datos_progreso如下面的代码所示),它是一个文本字段,包含序列化数据,但没什么大的。问题是,如果我运行完整 16000 条记录的脚本,我会收到内部服务器错误(日志中没有任何解释),如果我运行 1000 条记录的脚本,一切正常,所以这似乎指出它是资源问题。我尝试过(除其他事项外,我将在最后解释)将内存memory_limit从 128M 增加到 8GB(是的,你没看错),max_execution_time从 90 秒增加到 300 秒,max_input_vars从 1000 增加到 10000,但这并不能解决问题。我的想法是,数据量并没有那么大,不会导致资源耗尽,但我尝试以多种方式优化脚本,但无法使其工作。我让它工作的唯一一次是在一小部分记录上运行它,就像我上面提到的那样。我想知道是否可以通过脚本或 php 配置来解决此问题。顺便说一句,我无法用信息更改数据库表。我尝试过的我尝试过不使用bindModel,而是分别加载两个表的信息。因此,首先加载用户的所有信息,循环遍历它,并在每个循环中从表 2 中获取该特定用户的信息。我也尝试过与上面类似的方法,但不是立即加载表 1 中用户的所有信息,而是首先加载他们的所有 ID,然后循环这些 ID 以获取表 1 和表 2 中的信息。我想这样我会使用更少的内存。我也尝试过不使用 CakePHP's find(),而是使用fetchAll()“手动”查询,因为经过一些研究,它似乎在内存方面会更有效(似乎没有什么区别)如果我可以提供任何其他信息来帮助更好地了解正在发生的事情,请告诉我:)编辑:按照评论中的建议,我在 shell 脚本中实现了这一点,并且运行良好(需要一段时间,但完成时没有问题)。话虽如此,我仍然希望通过网络界面来完成这项工作。为了弄清楚发生了什么,并且由于 error_logs 没有真正显示任何相关内容,我决定自己进行一些性能测试。经过测试,这些是我的发现:这不是内存问题,因为脚本最多使用 300 MB 左右,而我给它的内存memory_limit是 8 GB无论是通过网络调用还是 shell 脚本,内存使用情况都非常相似这不是超时问题,因为我给脚本设置了 20 分钟限制,但在此之前它就崩溃了还有什么其他设置可以限制此/运行,当它是 shell 脚本时不会失败?
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

我解决这个问题的方法是按照评论中的建议使用shell 脚本。我知道我最初想要的方法不是正确的方法,虽然我无法弄清楚到底是什么导致了错误,但很明显使用 Web 脚本是问题的根源。



查看完整回答
反对 回复 2023-09-08
  • 1 回答
  • 0 关注
  • 59 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信