我有一个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
答案 0 :(得分:3)
确保使用Cron作业等进行设置,并在低负载时运行它。这取决于您网站的用户,因此您必须分析您的访问次数,以确定一个好的窗口。
如果只需要运行一次,那么为访问者提供维护窗口通知可能是有意义的。这将允许他们提前计划,不要指望在给定时间之间有超级响应站点。
答案 1 :(得分:1)
需要考虑的一些重要数据库因素。
我会在第2阶段之外的数据库事务中完成所有更新,而不是循环。
您应该查看数据库引擎,看它是否使用行/表锁定。如果在其他地方使用数据,这肯定会阻止数据被读/写。
我不知道你的数据集,但下面是一些有助于提高脚本速度的想法......
对数组键使用isset()而不是array_key_exists()要快得多,但请注意NULL值。
也许从数据库中散列密钥并将其与新数据集的散列进行比较。只需要在每行中检查一个值而不是多个值。可以保存很多迭代或密钥检查。
答案 2 :(得分:0)
如果您正在处理大量数据和一些繁重的处理,并且您主要关心的是维护服务器的可用性以执行其他任务(例如服务网站),您可能需要考虑将任务分成较小的块并且有一个cron作业定期处理每个作业。
除此之外,你一定要看看set_time_limit()
function。有了它,您可以通过传递零值 -
set_time_limit(0);