我有一个需要运行的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
答案 0 :(得分:0)
尝试在PHP文件中添加以下行,并告诉我它是否有效。
ini_set("max_execution_time", "0");
ini_set("memory_limit","2048M"); // change it as required