๊ฐ์ ธ ์ค๊ธฐ ํ ์ด๋ฒคํธ๊ฐ ์๋ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. :(
์ ํํฐ ์ํธ๊ฐ ์ ์๋ํฉ๋๋ค. ๋ด๊ฐ ๋ญ ์๋ชปํ๊ณ ์์ต๋๊น?
๋ฑ๋ก ์ด๋ฒคํธ์ ์๋ ๋ฑ๋ก ์ด๋ฒคํธ๋ฅผ ๋ชจ๋ ์๋ํ์ต๋๋ค.
namespace App\Imports;
use App\Order;
use App\Order\Address;
use Illuminate\Contracts\Queue\ShouldQueue;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\RegistersEventListeners;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithCustomCsvSettings;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Events\AfterImport;
use Maatwebsite\Excel\Events\BeforeImport;
class OrderAddressImport implements
WithHeadingRow,
ToModel,
WithBatchInserts,
WithChunkReading,
WithCustomCsvSettings,
ShouldQueue,
WithEvents
{
use Importable, RegistersEventListeners;
protected $order;
public function __construct(Order $order)
{
$this->order = $order;
}
/**
* <strong i="16">@param</strong> array $row
* <strong i="17">@return</strong> Address
*/
public function model(array $row)
{
$data = ['order_id' => $this->order->id];
$data = array_merge($data, $row);
return new Address($data);
}
public function batchSize() : int
{
return 1000;
}
public function chunkSize() : int
{
return 5000;
}
/**
* <strong i="18">@return</strong> array
*/
public function getCsvSettings(): array
{
return [
'delimiter' => ';',
'enclosure' => '',
'input_encoding' => 'UTF-8'
];
}
public static function afterImport(AfterImport $event)
{
dd($event);
}
}
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. WithChunkReading
๊ณ์ฝ์ ๊ตฌํํ๋ ๊ฒฝ์ฐ AfterImport
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ BeforeImport ์ด๋ฒคํธ์๋ ํด๋น๋๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
์ฝ๋๋ฅผ ๊ฐ๋ตํ ์ดํด ๋ดค๋๋ฐ ChunkReader ํด๋์ค์์์ด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ์ฝ๋๋ฅผ ์ ํ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ ๋ ์ด๊ฒ์ ๋ํ ์ข์ ํด๊ฒฐ์ฑ ์ ์์ต๋๋ค. ํ ๊ฐ์ง ํด๊ฒฐ์ฑ ์ afterImport ๋ฉ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋จ์ผ ์์ ์ ์ฒด์ธ์ ๊ด๊ณ ํ๋ ๊ฒ์ผ ์ ์์ต๋๋ค.
์ด ์ฃผ์ ์ ๋ํ ๋ต์ด ์์ต๋๊น? :)
์, ๋ฒ๊ทธ๋ก ํ์ธ๋์์ต๋๋ค. ํฅํ ๋ฒ์ ์์ ์ด์ ๋ํ ์๋ฃจ์ ์ ์ฐพ์ ์ ์๋์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
@GlennM ์ด๋ ๊ฒ ๋งํ๋ฉด์, BeforeChunk ๋ฐ AfterChunk ์ด๋ฒคํธ๋ ๊ตฌํํ ์์๋ ๋ฐฉ๋ฒ์ด ์๋์ง๋ณด๊ณ ์ถ์ต๋๋ค. ์งํ ์ํฉ์ ํ๋ฐํธ ์๋ GUI๋ฅผ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค ... ์ด๊ฒ์ผ๋ก ๊ณ ๋ คํ ์ฌํญ , ์ด ๊ฐ์ + ์ด ์ฒญํฌ + ํ์ฌ ์ฒญํฌ (์๊ฐ์์ํ ๊ฒ) ์ฌ์ผํฉ๋๋ค. ๋๋ถ๋ถ์ ํ์ผ์ GUI๋ฅผ ํตํด ์ํ๋์ง๋ง ์๋นํ ํฌ๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ข ๋ฅ์ "์งํ ์ค"์ ์ค ์์๋ ๊ฒ์ด ๋ถํ์คํ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค. ์งํ ํ์ ์ค
BeforeChunk ๋ฐ AfterChunk ์ฌ์ด๋๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
BeforeImport / AfterImport๋ ๋ ๊น๋ค ๋กญ์ต๋๋ค. ์ด๋ฅผ ์ฒด์ธ์ 2 ๊ฐ์ ์ถ๊ฐ ์์ ์ผ๋ก ์ถ๊ฐํ๋ฉด ํ์ผ์ 2 ๋ฐฐ ๋ค์ ์ด ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๊ฐ์ฅ ์ข์ ์ต์ ์ ์ฒซ ๋ฒ์งธ ์์ ์์ beforeimport๋ฅผ ์คํํ๊ณ ๋ง์ง๋ง ์์ ์์ afterimport๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ ๊ฐ๋ฅํ์ง ๋ณผ๊ฒ์.
์ฒญํฌ ์์ ์ BeforeImport / AfterImport ์ด๋ฒคํธ ์ถ๊ฐ์ +1. ๋๋ ์ด๊ฒ๋ค์ ์ฒด์ธ์ ๋ ๊ฐ์ ์ง์ ์ผ๋ก ์ถ๊ฐํ๊ธฐ์ํ ์ ์์ ์ ์ถํ๋ ค๊ณ ํ์ง๋ง, ๋น์ ์ด ์ด๋ฏธ ๊ทธ๊ฒ์ํ๊ณ ์๋ ๊ฒ ๊ฐ๋ค์! ์ฒซ ๋ฒ์งธ ์์ ๊ณผ ๋ง์ง๋ง ์์ ์์ ์ด๋ฒคํธ๋ฅผ ๊ตฌํํ๋ผ๋ ์ ์์ ๊ฐ๋ฅํ๋ฉด ๊ฐ์ฅ ์ ๋ค๋ฆฝ๋๋ค.
AfterImport๋ ShouldQueue ๋ฐ WithChunkReading์์ ์๋ํ์ง ์์ต๋๋ค.
๋ํ ํ์ ํ์ํ๋ฏ๋ก ํ ์คํ ์ข
๋ฃ์ ์ด๋ฒคํธ๊ฐ ๊ตฌํ๋์ง ์์ต๋๋ค.
๋ฌธ์ ์ ์ :
$ import-> queue ( 'users.xlsx')-> chain ([
์๋ก์ด NotifyUserOfCompletedImport (์์ฒญ ()-> ์ฌ์ฉ์ ()),
]);
๊ฐ ๋๊ธฐ์ด ํญ๋ชฉ์ ๋ค์์์ ์คํ๋ฉ๋๋ค. NotifyUserOfCompletedImport
Alguma sugestรฃo?
๋๋ ๊ฐ์ ๋ฌธ์ ์ ๋ถ๋ช์ณค๋ค. ShouldQueue๋ฅผ ๊ตฌํํ๋ ์์ ์ ๋ง๋ ๋ค์ ์ฌ๊ธฐ์์ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์คํํ๊ณ ๊ฐ์ ธ ์ค๊ธฐ๊ฐ ์๋ฃ๋ ํ ํ์ํ ์์ (๊ทธ๋ ์ง ์์ผ๋ฉด afterImport ์ด๋ฒคํธ์ ์์)์ ์ํํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๊ฐ์ ธ ์ค๊ธฐ๋ ๋ฐฐ์น ์ฝ์ ๋ฐ ์ฒญํฌ ์ฝ๊ธฐ๋ฅผ ๊ตฌ์ฑํ์ผ๋ฉฐ ์์ ์์ ๋๊ธฐ์์ผ๋ก ์คํ๋ฉ๋๋ค.
์์ ์ด์ ์ค ํ๋๋ ์์ ์ ์คํํ๋ ํ ์์ ์๋ฅผ ์ฝ๊ฒ ์ ์ด ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ ๋ค๋ฅธ (๋งค์ฐ ์ค์ํ) ์ด์ ์ ๋๊ธฐ์ค์ธ ์์ ์ผ๋ก XLS ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. Import ํด๋์ค ์์ฒด์์ ShouldQueue๋ฅผ ๊ตฌํํ๋ ํ์ค ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ถ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
๋๊ฐ์ ์ง๋ฌธ์ด ์์ต๋๋ค .ใใใ ์ด๋ป๊ฒํ๋ฉด ...
@patrickbrouwers์์ ์ ๋ฐ์ดํธ ๋ ๋ฌธ์์ zxl2006001 @ ๋๋์ด ๋ ผ๋ฆฌ๋ฅผ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
(new UsersImport)->queue('users.xlsx')->chain([
new NotifyUserOfCompletedImport(request()->user()),
]);
์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค : https://docs.laravel-excel.com/3.1/imports/queued.html#appending -jobs
ํ์ฌ ๋์์ธ์๋ ์ค์ ๋ก ๋ ๊ฐ์ง ๊ฒฐ๊ณผ๊ฐ ๋ ์์ต๋๋ค.
Reader ํด๋์ค read ๋ฉ์๋๋ฅผ ์ดํด๋ณด๋ฉด ์ beforeImport๊ฐ ChunkReader ์ฝ๊ธฐ๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ๋ ๊ธฐ์ ์ผ๋ก ๋ฐ์ํ๋ ๋์ beforeReading ๋ด์์๋ง ๋ฐ์ํ๋์ง ๋ช ํํ์ง ์์ต๋๋ค.
์ฒญํฌ ์๋๋ฆฌ์ค์์๋ ์๋ฆผ ์์ ์ ์ํํ๊ธฐ ์ํด ์์ ์ ์ฐ๊ฒฐํ ์ ์์ง๋ง "currentFile"์์ฑ์ด ๋ณดํธ๋๊ธฐ ๋๋ฌธ์ ์์ ํ์ผ์ ์ ์ ํ๊ฒ ์ ๋ฆฌํ ์ ์์ผ๋ฉฐ ์๋์ผ๋ก ์ํ๋์ง ์์ต๋๋ค. ๋ชจ๋ ReadChunk ์ดํ์ ์ฐ๊ฒฐ๋ ์์ ์ afterImport์ ์์ ์ ๋ฆฌ.
์คํจํ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ํ์ฌ ์๊ฐํ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ laravels ์ ์ญ ์์ ์ค๋ฅ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๊ทธ ๋ฌธ์ ๋ aatwebsiteExcel \ Jobs \ ReadChunk ํ๋ก์ธ์ค๋ฅผ ์ ์ด ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ์คํจํ ์์ ์ ๋ํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ญ ์ด๋ฒคํธ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
chunkSize๋ฅผ ์ฌ์ฉํ ๋ ์ค๋ฅ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๊น?
๋ค์ ๋ฆด๋ฆฌ์ค (ํ์ฌ 3.1-dev)๋ ์ฒญํฌ ์ฝ๊ธฐ๋ฅผ์ํ Before / AfterImport ์ด๋ฒคํธ๋ฅผ ์ง์ํฉ๋๋ค. ๋ํ ์ฒญํฌ ์์
์ด ์คํจ ํ ๋ ๋ฐ์ํ๋ ImportFailed
์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. (https://twitter.com/patrickbrouwers/status/1114166252711415808)
3.1 ๋ธ๋์น์์ ์์ ๋กญ๊ฒ ํ ์คํธํ๊ณ ์์ธ์ ์ผ๋ก ์๋ํ๋์ง ์๋ ค์ฃผ์ธ์.
๊ฐ์ ธ ์ค๊ธฐ์ database
๋๊ธฐ์ด ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ์ ธ ์ค๊ธฐ ํด๋์ค์์ WithChunkReading
๋ฅผ ๊ตฌํํ๋ฉด AfterImport
์ด๋ฒคํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ๋ฆฌ๊ฑฐํ๋๋ก ์ด์์๊ฐ ๋ฐ์ํฉ๋๋ค. ์์๋๋ ๋์์
๋๊น?
database
๋๊ธฐ์ด ๋๋ผ์ด๋ฒ ๋ฐ ๋ฒ์ 3.1
์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์ฌ ๋๋ง๋ค AfterImport
์ด ๋ ๋ฒ ํธ๋ฆฌ๊ฑฐ๋๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค.
database
๋๊ธฐ์ด ๋๋ผ์ด๋ฒ ๋ฐ ๋ฒ์ 3.1
๋ก๋ ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์คํ ํ ํ AfterImport
์ด (๊ฐ) ๋ฌด๊ธฐํ ํธ๋ฆฌ๊ฑฐ๋๋ ๊ฒฝํ์ด ์์ต๋๋ค.
redis ํ ๋๋ผ์ด๋ฒ๋ฅผ ๊ฐ์ ธ ์ค๊ธฐ์ ์ฌ์ฉํ๊ณ ๊ฐ์ ธ ์ค๊ธฐ ํด๋์ค์์ WithChunkReading ์ ๊ตฌํํ๋ฉด AfterImport ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ๋ฆฌ๊ฑฐํ๋๋ก ์ด์์๊ฐ ๋ฐ์ํฉ๋๋ค. ์์๋๋ ๋์์ ๋๊น?
๋ค์์ ์ค๋ฅ ๋ก๊ทธ์ ๋๋ค.
local.ERROR: unlink(/Users/sineld/Code/project/public/uploads/tmp/laravel-excel-qfK6O5aCHxhFXioVayQbLQag5UnFKyxB.xlsx): No such file or directory {"exception":"[object] (ErrorException(code: 0):
๊ทธ๋ ์ AfterImport๋ ๋ ๋ฒ ํธ์ถ๋ฉ๋๋ค.
๋ํ AfterImport ๋ฆฌ์ค๋๊ฐ ๋ ๋ฒ ํธ์ถ๋๊ณ ์์ต๋๋ค. xdebug๋ก ๋๋ฒ๊น ํ ํ ๋ฆฌ์ค๋๊ฐ ๋ ์์น์ ๋ฑ๋ก๋์ด ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋ค์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ํด ์์ ๋จ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค์ ๋ฆด๋ฆฌ์ค (ํ์ฌ 3.1-dev)๋ ์ฒญํฌ ์ฝ๊ธฐ๋ฅผ์ํ Before / AfterImport ์ด๋ฒคํธ๋ฅผ ์ง์ํฉ๋๋ค. ๋ํ ์ฒญํฌ ์์ ์ด ์คํจ ํ ๋ ๋ฐ์ํ๋
ImportFailed
์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. (https://twitter.com/patrickbrouwers/status/1114166252711415808)3.1 ๋ธ๋์น์์ ์์ ๋กญ๊ฒ ํ ์คํธํ๊ณ ์์ธ์ ์ผ๋ก ์๋ํ๋์ง ์๋ ค์ฃผ์ธ์.