如何编写php脚本,使其每小时在分页sql查询上运行一次


How do I code a php script to run on a paged sql query every hour

我有一个大型数据库,我需要设置一个cron作业,该作业将在数据上运行计划任务。问题是,有问题的表有大约100000个条目,所以我需要设置我的cron作业,使其每30分钟运行1000个条目,在下一次运行cron作业时选择下一页条目。

我知道,为了做到这一点,我必须将最后一页被访问/处理过的条目存储在某个地方——然而,我不太确定什么是最好、最简单的方法。我正在这里开发一个基于Laravel的应用程序。

有几种方法可以做到这一点,下面是我想到的一些方法。

创建某种临时文件,具有的文件具有运行次数/最后一行。

然后每次运行php文件都会使用filegetcontents读取该数字。如果选择运行次数,只需将其乘以1000,然后将查询限制为1000。如果你选择最后一行,你只需要限制最后一行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);

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

方法1:FILE

实现这一点的一种方法是store the record number to start with in a file。每隔30分钟,cron就会读取该文件,以知道它必须从哪个记录号开始。您可以将此文件放置在与cron文件相同的文件中,也可以将其存储在laravel的应用程序文件夹中。

例如:

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:数据库

另一种方法是将其存储在数据库中:类似问题