Php 失去记忆
我试图将数据导出到,但出现错误: Connection.php第321行中的FatalErrorException:允许的内存大小为 134217728字节已用尽(尝试分配196605字节) 我知道我可以提高php的内存限制,但我想知道为什么我的代码占用这么多内存 我的代码:Php 失去记忆,php,excel,laravel-5,Php,Excel,Laravel 5,我试图将数据导出到,但出现错误: Connection.php第321行中的FatalErrorException:允许的内存大小为 134217728字节已用尽(尝试分配196605字节) 我知道我可以提高php的内存限制,但我想知道为什么我的代码占用这么多内存 我的代码: public function exportExcel() { $datum = date("d-m-Y"); Excel::create('Sales export '.$datum, functi
public function exportExcel()
{
$datum = date("d-m-Y");
Excel::create('Sales export '.$datum, function($excel) {
$datum = date("d-m-Y");
// Chain the setters
$excel->setCreator('some name')
->setCompany('some company')
->setDescription('sales export.')
->setTitle('Salesexport '.$datum);
$excel->sheet('sales '.$datum, function($sheet) {
$orders = Order::orderBy('created_at','desc')->get();
$sheet->appendRow(array(
"merk","product","artikel nr","categorie","collectie","maat","omschrijving","inkoopprijs","verkoopprijs","prijs betaald","aantal verkocht","verkocht aan", "totaal","dag","maand","jaar","kwartaal","reseller","verkoper","bestel naam"
));
foreach($orders as $order)
{
foreach($order->products as $p)
{
$sizeLink = $p->productSize;
$productLink = $sizeLink->product;
// Append row as very last
$sheet->appendRow(array(
$productLink->brand->name,
$productLink->name,
$productLink->artnr,
$productLink->category->name,
$productLink->collection->name,
$sizeLink->size->name,
$productLink->desciption,
number_format((float) $productLink->price_buy_in, 2, ',', ''),
number_format((float) $productLink->price, 2, ',', ''),
number_format((float) $p->price, 2, ',', ''),
$p->quantity, //geboekt aantal
$order->billingname . $order->billingnamelast,
number_format((float) $p->quantity * $p->price, 2, ',', ''), // totaal kosten
//number_format((float) ($p->quantity * $p->price - $p->quantity * $p->price_buy_in), 2, ',', ''), // winst inkoop-verkoop
date("d",strtotime($order->created_at)),
date("n",strtotime($order->created_at)),
date("Y",strtotime($order->created_at)),
ceil(date("m",strtotime($order->created_at))/3),
$order->reseller->name,
$order->creator,
$order->name,
));
}
}
// Auto filter for entire sheet
$sheet->setAutoFilter();
$sheet->freezeFirstRow();
// Set black background
$sheet->row(1, function($row) {
// call cell manipulation methods
$row->setBackground('#cccccc');
$row->setFontWeight("bold");
});
$sheet->setColumnFormat(array(
'G' => \PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00,
'H' => '[$EUR ]#,##0.00_-',
'I' => \PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00,
));
});
})->download('xlsx');;
}
似乎您试图同时处理太多进程,占用了太多内存,您应该使用Laravel的收集方法,如下所示:
Order::orderBy('created_at','desc')->chunk(10, function($orders)use ($sheet) {
foreach($orders as $index => $order) {
// Do your stuff here...
}
}
希望这有帮助 您通常在这里处理多少行?订单包含135行。orderproducts 1350您是否可以将数据存储在缓存中(每天大约凌晨3点),然后尝试导出它们,或者您需要“新”数据?@ka_lin需要新数据,它大约一周只发布一次。你能对结果集提出一个限制,让每日报告与所有报告相比吗?chunk会做一个限制查询还是只对结果集应用数组\u chunk?我得到一个错误行:foreach($order->products->chunk(10)as$p){“Undefined property:Illumb\Database\Eloquent\Collection::$products”方法将代码分块处理,这样php一次处理10个集,而不是1350个集(如您所述)这避免了大量内存使用!!请检查
$order
是否是一个对象或集合,在我看来它似乎是一个集合。不应该在get查询“$orders=order::orderBy('created_at','desc')->get()”中使用块