长时间运行的PHP脚本,加载大量数据

时间:2013-01-29 18:17:40

标签: php

我有一个PHP脚本只能在生产Web服务器上运行一次。该脚本加载了大量的db记录,然后对它们进行迭代,json_decoding一个字段并进行检查。某些字段将被修改并保存回数据库。

该脚本将消耗大量内存,并可能运行1小时或更长时间。

对于确保不会导致网站出现故障或此类脚本存在任何其他潜在危险,我应该记住这类脚本。

脚本的基本流程如下:

1. load all records from db table
2. iterate over each row
  2.1 json_decode specific field
  2.2 if a matching field is found then
      2.2.1 Change the value 
      2.2.2 Save back to the database

3 个答案:

答案 0 :(得分:3)

确保使用Cron作业等进行设置,并在低负载时运行它。这取决于您网站的用户,因此您必须分析您的访问次数,以确定一个好的窗口。

如果只需要运行一次,那么为访问者提供维护窗口通知可能是有意义的。这将允许他们提前计划,不要指望在给定时间之间有超级响应站点。

答案 1 :(得分:1)

需要考虑的一些重要数据库因素。

我会在第2阶段之外的数据库事务中完成所有更新,而不是循环。

您应该查看数据库引擎,看它是否使用行/表锁定。如果在其他地方使用数据,这肯定会阻止数据被读/写。

我不知道你的数据集,但下面是一些有助于提高脚本速度的想法......

对数组键使用isset()而不是array_key_exists()要快得多,但请注意NULL值。

也许从数据库中散列密钥并将其与新数据集的散列进行比较。只需要在每行中检查一个值而不是多个值。可以保存很多迭代或密钥检查。

答案 2 :(得分:0)

如果您正在处理大量数据和一些繁重的处理,并且您主要关心的是维护服务器的可用性以执行其他任务(例如服务网站),您可能需要考虑将任务分成较小的块并且有一个cron作业定期处理每个作业。

除此之外,你一定要看看set_time_limit() function。有了它,您可以通过传递零值 -

来确保您的脚本不会超时
set_time_limit(0);