我有一个大型数据库 - 我需要设置一个可以在数据上运行计划任务的cron作业。问题是有问题的表有超过100'000个条目,所以我需要设置我的cron作业,这样它每30分钟运行1000个条目,在下一个cron作业运行时选择下一页条目。
据我所知,为了做到这一点,我必须存储已经访问/处理的条目的最后一页 - 但是我不太确定这是最好和最简单的方法。我正在这里开发一个基于Laravel的应用程序。
答案 0 :(得分:0)
方法1:文件
实现此目的的一种方法是store the record number to start with in a file
。
每30分钟,cron将读取该文件以了解它必须以哪个记录号开头。您可以将此文件放在与cron文件相同的文件中,也可以将其存储在laravel的app文件夹中。
例如:
Execution 1 :
startIndex.php has content '1'
Cron.php will print records 1 to 1000 and also set startIndex.php content to 1001
Execution 2 :
startIndex.php has content '1001'
Cron.php will print records 1001 to 2000 and also set startIndex.php content to 2001
方法2:数据库
其他方式是将其存储在数据库中:Similar question
答案 1 :(得分:0)
有几种方法可以做到这一点,这里有一些想到的。
创建某种临时文件,该文件具有运行次数/最后一行。
然后每次运行php文件都会使用file_get_contents读取该数字。 如果您选择运行次数,则只需将其乘以1000并按此限制查询。 如果你选择最后一行,你只需要限制lastrow,1000。完成后,只需使用file_put_contents更新文件即可。 取决于您选择的方法。
使用最少的代码,这将非常简单。
示例强>
$lastrow = file_get_contents("lastrow.log");
$query = mysql_query("SELECT..... LIMIT $lastrow,1000");
while(..){
//Do you code
$lastrow++;
}
//You can check if have gone trough all of the table and reset $lastrow to 0
file_put_contents("lastrow.log",$lastrow);
不同的解决方案: 您还可以向表中添加一个列,将标记该行是否已处理,然后每行更新一次。当在文件的乞讨处没有返回任何行时,只需重置所有行的列。