我有一个包含1800个联系人记录的大型数据库。正在使用PHP脚本来促进Word Mailmerge"。当我使用500条记录进行mailmerge时,大约需要40秒。但要对1800条记录执行相同操作,任务的执行时间约为300秒,其中不应超过180-200秒。
我已经调整了PHP.ini和php-fpm配置并增加了一些值,但结果没有改进。执行大量记录时PHP是否正常?
答案 0 :(得分:1)
每次都是300秒(即5分钟)吗?如果是这样,我认为你可能会以某种方式陷入其中一条记录,并且PHP正在达到其max_execution_time。
尝试使用1800的后一个1300运行脚本(通过向查询添加LIMIT 501, 1300
)。需要300秒吗?
尝试将记录集分成两半(在一次尝试中添加LIMIT 0, 900
,然后在下一次尝试中添加LIMIT 901,900
)。获取导致300秒执行时间的集合并将 分成两半 - 继续直到找到导致您麻烦的记录。
调查该记录并查看它导致无限循环或挂起的原因。
此外,您是否有E_ALL
错误报告?您可能有通知或警告可能会对此问题有所了解。
更新:
在您的脚本中,您定义了查询字符串,在分配之后和查询调用之前添加echo
连接<br>
。然后将echo
包裹在ob_end_flush();
和ob_start();
。
例如,如果您有这样的代码:
$query = "SELECT * FROM {contacts};";
$result = mysqli_query($query);
将其更改为:
$query = "SELECT * FROM {contacts};";
ob_end_flush();
# CODE THAT NEEDS IMMEDIATE FLUSHING
echo $query . "<br>";
ob_start();
$result = mysqli_query($query);
这将使PHP立即回显查询字符串,而无需等待脚本执行结束或缓冲区填充。然后,您可以在脚本仍在运行时查看输出,并立即确定实际发生的情况(脚本在一个特定记录上挂起,或者执行时间合法增加,因为您对越来越多的记录进行迭代)。 / p>
如果你真的分享你的代码,我将能够提供更多帮助。
答案 1 :(得分:1)
1800是非常少量的记录,不应该花费任何时间来处理。您能否提供有关流程本身的更多详细信息?这是一个网页/后台流程吗?您是否向所有这些用户发送相同的数据?
这种类型的事情应该由工作者/后台进程处理,因此,通常,您不应该关心提供作业完成所需的时间(在合理范围内)。也就是说,因为它是一个如此小的范围,你可以通过尝试先发送250并将基准时间设置为你所期望的平均250个记录来解决这个过程。每次增加250。如果每次增加批量大小时平均时间增加,那么您可以确定代码有问题 - 在这种情况下将其发布在此处,我们可以尝试为您解决。如果平均值仅在特定窗口内增加(例如在750和1000之间),则可能是数据问题。
这是一种简单的方法,我可以建议不看任何代码或有任何额外的细节。