如何使用Cron脚本

时间:2017-10-11 14:46:03

标签: php mysql

我正在编写一个PHP Cron脚本,它将从论坛部分获取所有线程并迭代以查看它们是否符合某些条件(例如,如果它们超过2年)。

通常我会这样做:

SELECT DATE_CREATED FROM `threads`
WHERE BOARD = board_id
AND (YEAR(NOW()) - YEAR(DATE_CREATED)) >= 2

然后相应地循环。

现在有可能有1,000,000或更多线程符合此标准。

最初,我认为不需要限制返回的行,因为它是一个Cron脚本

现在我认为当返回的行变得非常大时,可能会出现一些内存问题。

这是我需要帮助来解决如何在将由Cron作业执行的PHP脚本中有效循环数千条MySQL记录的问题。

我曾考虑使用LIMIT然后将其作为分页内容进行迭代,但我想知道是否有更有效的方法来执行此操作;希望只在MySQL服务器上。

提前致谢。

1 个答案:

答案 0 :(得分:0)

1-第一个解决方案 - 使用限制和偏移将类似于(伪代码):

//get total number of rows
$total_rows = $db->$query("SELECT COUNT(*) FROM `threads`
WHERE BOARD = board_id
AND (YEAR(NOW()) - YEAR(DATE_CREATED)) >= 2");

//put in your array or wherever you need 1000 rows at a time
for($i = 0; $i < $total_rows/1000; i++){
   $array << $db->query("SELECT DATE_CREATED FROM `threads`
   WHERE BOARD = board_id
   AND (YEAR(NOW()) - YEAR(DATE_CREATED)) >= 2
   LIMIT ($i+1, $i+1)*1000");
}

2 - 解决方案:逐月获取行数,考虑到你只有两年(比如2016-2017),为了简单起见你可以做类似的事情

$base_year = 2016;
//nest loops for the years and for the months
for($i = 0; $i < 2; $i++){
   for($j = 0; j < 12; $j++){
      $array << $db->query("SELECT DATE_CREATED FROM `threads`
       WHERE BOARD = board_id
       AND YEAR(DATE_CREATED) = ($i + $base_year)
       AND MONTH(DATE_CREATED = ($j+1)");
   }
}

希望这有助于您找到合适且更合适的方式。