我如何编写PHP脚本每小时运行一次分页的SQL查询

时间:2016-01-09 13:59:59

标签: php pagination cron scheduled-tasks cron-task

我有一个大型数据库 - 我需要设置一个可以在数据上运行计划任务的cron作业。问题是有问题的表有超过100'000个条目,所以我需要设置我的cron作业,这样它每30分钟运行1000个条目,在下一个cron作业运行时选择下一页条目。

据我所知,为了做到这一点,我必须存储已经访问/处理的条目的最后一页 - 但是我不太确定这是最好和最简单的方法。我正在这里开发一个基于Laravel的应用程序。

2 个答案:

答案 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);

不同的解决方案: 您还可以向表中添加一个列,将标记该行是否已处理,然后每行更新一次。当在文件的乞讨处没有返回任何行时,只需重置所有行的列。