使用CronJob处理大量数据

时间:2016-03-09 09:47:34

标签: php cron

我有一个需要运行的cron,基本上它会生成一个带有mPDF的PDF文件并将其发送给指定的人员。这个cron将处理的电子邮件数量可以是1到1000人甚至更多。

生成过程已经花费了相当多的时间,因为cron需要访问数据库并准备PDF文件。

此刻,当cron到达第10个客户端时,它会爆炸,因为达到了内存限制。(需要大量内存)

无论如何运行cron并让它释放内存,甚至让它在没有内存限制的情况下运行?任何可能的解决方案......

代码

$table = "tblclients";
$fields = "id";
$where = array("status" => "Active");
$clientsresult = select_query($table,$fields,$where);
while ($clientsdata = mysql_fetch_array($clientsresult)){
   $client_id=$clientsdata['id'];
   $period_from=date("d-m-Y", strtotime(date("Y-m-d").' -0 years -1 months -0 days'));
   $period_to=date(sprintf("%02d", $day).'-m-Y');
   if(get_balance_for_period($client_id,-2000,29)>0){
      $statement=generate_custom_report($client_id,$period_from,$period_to,"F");
      mail_statment($client_id,MYROOT.'/generated/'.$statement,$period_from,$period_to);
      unlink(MYROOT.'/generated/'.$statement);
   }
}

以下代码显示了如何运行cron,generate_custom_report生成报告,然后使用mail_statement函数发送报告,然后删除pdf ...

我不确定将保留内存的位置,因为每个外观都使用相同的变量,内存是否未被释放?

内存使用:

在下面的示例中,您应该能够看到每个客户端如何使用内存。您会注意到这里只处理了25个客户。但是内存使用量是600MB ...这意味着如果你处理1000个你最终需要24GB的内存,大多数服务器都不会提供......

是否有可能解决内存滥用的问题?

sending to 1 | Memory bytes: 16123384
sending to 12 | Memory bytes: 56914024
sending to 13 | Memory bytes: 79047568
sending to 14 | Memory bytes: 111560288
sending to 17 | Memory bytes: 222810720
sending to 23 | Memory bytes: 250151664
sending to 24 | Memory bytes: 293685600
sending to 33 | Memory bytes: 299987024
sending to 30 | Memory bytes: 313091856
sending to 34 | Memory bytes: 386661752
sending to 41 | Memory bytes: 411917048
sending to 52 | Memory bytes: 446857024
sending to 65 | Memory bytes: 457177864
sending to 59 | Memory bytes: 464880584
sending to 63 | Memory bytes: 498235608
sending to 97 | Memory bytes: 526843496
sending to 83 | Memory bytes: 534199208
sending to 86 | Memory bytes: 546184000
sending to 85 | Memory bytes: 556632648
sending to 88 | Memory bytes: 567034592
sending to 89 | Memory bytes: 576347920
sending to 94 | Memory bytes: 589466432
sending to 93 | Memory bytes: 598519680
sending to 96 | Memory bytes: 602776992
sending to 102 | Memory bytes: 604044912

1 个答案:

答案 0 :(得分:0)

尝试在PHP文件中添加以下行,并告诉我它是否有效。

ini_set("max_execution_time", "0");
ini_set("memory_limit","2048M"); // change it as required