0

我有一个 PHP 脚本只会在生产 Web 服务器上运行一次。该脚本加载大量数据库记录,然后对其进行迭代,对字段进行 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
4

3 回答 3

3

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

如果这只需要运行一次,则为访问者发布维护窗口通知可能是有意义的。这将使他们能够提前计划,不要期望在给定时间之间有一个超级响应的站点。

于 2013-01-29T18:24:26.277 回答
1

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

最后,我将在第 2 阶段之外的数据库事务中进行所有更新,而不是循环。

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

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

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

也许从数据库中散列键并将其与新数据集的散列进行比较。只需要检查一个值而不是每行中的多个值。可以节省大量迭代或关键检查。

于 2013-01-29T18:48:27.813 回答
0

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

除此之外,您绝对应该看一下该set_time_limit()功能。有了它,您可以通过传递零值来确保您的脚本不会超时 -

set_time_limit(0);
于 2013-01-29T18:22:43.563 回答