質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

2897閲覧

Laravel Excel 3.0 にて大量のデータを取得したい。

hrsi_teratail

総合スコア93

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/04/09 06:06

Laravel 5.6 + maatwebsite/excel 3.0
を使用しています。

PHP

1class UsersExport implements FromCollection { 2 3 public function collection() { 4 return \App\Model\User::orderBy('id', 'DESC')->get(); 5 6 } 7} 8

のクラスにて、EXCELダウンロードすると、

Allowed memory size of 134217728 bytes exhausted (tried to allocate 4194304 bytes)
のメモリエラーになります。

chunk等を使用して、メモリ節約して取得実施したいのですが、
どのような記述になりますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

3.0で全面的に作り直されてるので旧バージョンの情報は役に立ちませんね…。
FromQueryの方法ならchunkで実行される。
さらに時間がかかるならこれをキューで実行して終了したら通知するとかLaravelならそこまでできる。

投稿2018/04/09 06:47

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hrsi_teratail

2018/04/09 07:02

>FromQueryの方法ならchunkで実行される。 すいません、どのような記述になりますか?
guest

0

ini_set('memory_limit', '512M');
を設定で解決ずみ

投稿2018/05/07 23:01

hrsi_teratail

総合スコア93

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

他の回答者様の内容にありますが、From Queryの場合は自動でChunkが適用されます。下記の様に書く事で正常に動作しました。ちなみに、chunkの件数は、config/excel.phpで定義されています。
公式サイト

Controller側

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Test\TestExcel; 7 8class homeController extends Controller 9{ 10 public function index(Request $request) { 11 return (new TestExcel())->download('test.xlsx'); 12 } 13}

抽出処理

php

1<?php 2namespace App\Test; 3/* 4 * To change this license header, choose License Headers in Project Properties. 5 * To change this template file, choose Tools | Templates 6 * and open the template in the editor. 7 */ 8 9use Maatwebsite\Excel\Concerns\FromQuery; 10use Maatwebsite\Excel\Concerns\Exportable; 11use App\User; 12 13 14/** 15 * Description of TestExcel 16 * 17 */ 18class TestExcel implements FromQuery { 19 use Exportable; 20 21 public function query(){ 22 //get()は不要なので要注意! 23 return User::orderBy('id', 'DESC'); 24 } 25}

(こちらの情報は古いバージョンの為、3.0には適用できません)

若干、古いバージョンのIssueですが下記が参考になるのではないでしょうか?参考サイト

php

1Excel::create('ExcelFile', function($excel) { 2 $excel->sheet('Sheet1', function($sheet) { 3 ExampleModel::chunk(500, function($modelInstance) use($sheet) { 4 5 $modelAsArray = $modelInstance->toArray(); 6 $sheet->appendRow($modelAsArray); 7 }); 8 }); 9})->export('xls');

投稿2018/04/09 06:19

編集2018/04/09 08:33
motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hrsi_teratail

2018/04/09 06:34

すいません、新バージョンはこの方法は使用できないみたいなので、 その他方法を調査しています。
motuo

2018/04/09 07:25

回答を修正しました。
hrsi_teratail

2018/04/09 07:57

Allowed memory size of 134217728 bytes exhausted (tried to allocate 16777224 bytes) メモリエラーが出ますね。 Chunkがきいていない?気がします。 excel.php の設定ファイルの chunk_sizeをデフォルトの1000から、500に変更しましたが、 同様でした。 usersテーブルは、2万件ほど格納しています。
motuo

2018/04/09 08:41

「Chunkがきいていない?」かどうか、きちんと調べた方が良いと思います。 Maatwebsite\Excel\Sheet.phpにある、下記のメソッドを通ります。(上記のサンプルでは下記の処理を通りました) ここでは、chunkを使っているので、きかない、という事は無いと思いますが… 通っていなければ、コード側が間違っている事になるかと思います。 /** * @param FromQuery $sheetExport * @param Worksheet $worksheet */ public function fromQuery(FromQuery $sheetExport, Worksheet $worksheet) { $sheetExport->query()->chunk($this->chunkSize, function ($chunk) use ($sheetExport, $worksheet) { foreach ($chunk as $row) { $this->appendRow($row, $sheetExport); } }); } それでもダメな場合は、chunk_sizeをもっと小さくしてみては如何でしょうか?
motuo

2018/04/09 08:52

ちなみにですが、メモリ8GBのマシンで動しましたが、問題なく2万件のUsersテーブルを 取得する事は出来ました。(UsersテーブルのカラムはLaravelデフォルトのもの)
hrsi_teratail

2018/04/09 09:16

処理はきちんと、通っているようです。 public function fromQuery(FromQuery $sheetExport, Worksheet $worksheet) { $sheetExport->query()->chunk($this->chunkSize, function ($chunk) use ($sheetExport, $worksheet) { //dd($this->chunkSize); foreach ($chunk as $row) { $this->appendRow($row, $sheetExport); } // dd($this); ここでは問題なし }); dd($this); // ここでメモリーエラー } chunk_sizeを100にしてもNGです。 foreachでは、問題ないですが、 $sheetExport->query()->chunk( を抜けると、NGでした。
motuo

2018/04/09 09:23 編集

php.iniのmemory_limitはどうなっていますか?私の場合、128Mでも動きましたが、例えば2048MBなどにしてもダメでしょうか?
hrsi_teratail

2018/04/09 10:26

サイズを2048Mに変更しても同様にエラーになります。 vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory.php で public function set($key, $value, $ttl = null) { $this->cache[$key] = $value; // ここでエラー return true; } Symfony \ Component \ Debug \ Exception \ FatalErrorException (E_UNKNOWN) Allowed memory size of 134217728 bytes exhausted (tried to allocate 18874368 bytes)
motuo

2018/04/10 00:07

エラーメッセージ見ると、質問時から割当メモリが増えていない様に見えます。(134217728 bytes exhaustedのまま。) php.iniを変更した後に、サーバーの再起動をしましたか?または、コードのどこかにini_set('memory_limit', '128M')がありませんか?
hrsi_teratail

2018/04/10 16:56 編集

再起動後に、試しました。 ini_set('memory_limit', ... の記述もありませんでした。 環境の問題?でしょうか。
motuo

2018/04/11 04:38

環境の問題、といえばそうですね。サーバまたは、PHPのどこかで使えるメモリが128MBに制限されてしまっている事が根本的な原因の様です… そちらを探ってみては如何でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問