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

我试图将数据导出到,但出现错误:

Connection.php第321行中的FatalErrorException:允许的内存大小为 134217728字节已用尽(尝试分配196605字节)

我知道我可以提高php的内存限制,但我想知道为什么我的代码占用这么多内存

我的代码:

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()”中使用块