[
MAINHACK
]
Mail Test
BC
Config Scan
HOME
Create...
New File
New Folder
Viewing / Editing File: QueuedWriter.php
<?php namespace Maatwebsite\Excel; use Illuminate\Foundation\Bus\PendingDispatch; use Illuminate\Support\Collection; use Illuminate\Support\LazyCollection; use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\FromQuery; use Maatwebsite\Excel\Concerns\FromView; use Maatwebsite\Excel\Concerns\WithCustomChunkSize; use Maatwebsite\Excel\Concerns\WithCustomQuerySize; use Maatwebsite\Excel\Concerns\WithMultipleSheets; use Maatwebsite\Excel\Files\TemporaryFile; use Maatwebsite\Excel\Files\TemporaryFileFactory; use Maatwebsite\Excel\Jobs\AppendDataToSheet; use Maatwebsite\Excel\Jobs\AppendPaginatedToSheet; use Maatwebsite\Excel\Jobs\AppendQueryToSheet; use Maatwebsite\Excel\Jobs\AppendViewToSheet; use Maatwebsite\Excel\Jobs\CloseSheet; use Maatwebsite\Excel\Jobs\QueueExport; use Maatwebsite\Excel\Jobs\StoreQueuedExport; use Traversable; class QueuedWriter { /** * @var Writer */ protected $writer; /** * @var int */ protected $chunkSize; /** * @var TemporaryFileFactory */ protected $temporaryFileFactory; /** * @param Writer $writer * @param TemporaryFileFactory $temporaryFileFactory */ public function __construct(Writer $writer, TemporaryFileFactory $temporaryFileFactory) { $this->writer = $writer; $this->chunkSize = config('excel.exports.chunk_size', 1000); $this->temporaryFileFactory = $temporaryFileFactory; } /** * @param object $export * @param string $filePath * @param string $disk * @param string|null $writerType * @param array|string $diskOptions * @return \Illuminate\Foundation\Bus\PendingDispatch */ public function store($export, string $filePath, ?string $disk = null, ?string $writerType = null, $diskOptions = []) { $extension = pathinfo($filePath, PATHINFO_EXTENSION); $temporaryFile = $this->temporaryFileFactory->make($extension); $jobs = $this->buildExportJobs($export, $temporaryFile, $writerType); $jobs->push(new StoreQueuedExport( $temporaryFile, $filePath, $disk, $diskOptions )); return new PendingDispatch( (new QueueExport($export, $temporaryFile, $writerType))->chain($jobs->toArray()) ); } /** * @param object $export * @param TemporaryFile $temporaryFile * @param string $writerType * @return Collection */ private function buildExportJobs($export, TemporaryFile $temporaryFile, string $writerType): Collection { $sheetExports = [$export]; if ($export instanceof WithMultipleSheets) { $sheetExports = $export->sheets(); } $jobs = new Collection; foreach ($sheetExports as $sheetIndex => $sheetExport) { if ($sheetExport instanceof FromCollection) { $jobs = $jobs->merge($this->exportCollection($sheetExport, $temporaryFile, $writerType, $sheetIndex)); } elseif ($sheetExport instanceof FromQuery) { $jobs = $jobs->merge($this->exportQuery($sheetExport, $temporaryFile, $writerType, $sheetIndex)); } elseif ($sheetExport instanceof FromView) { $jobs = $jobs->merge($this->exportView($sheetExport, $temporaryFile, $writerType, $sheetIndex)); } $jobs->push(new CloseSheet($sheetExport, $temporaryFile, $writerType, $sheetIndex)); } return $jobs; } /** * @param FromCollection $export * @param TemporaryFile $temporaryFile * @param string $writerType * @param int $sheetIndex * @return Collection|LazyCollection */ private function exportCollection( FromCollection $export, TemporaryFile $temporaryFile, string $writerType, int $sheetIndex ) { return $export ->collection() ->chunk($this->getChunkSize($export)) ->map(function ($rows) use ($writerType, $temporaryFile, $sheetIndex, $export) { if ($rows instanceof Traversable) { $rows = iterator_to_array($rows); } return new AppendDataToSheet( $export, $temporaryFile, $writerType, $sheetIndex, $rows ); }); } /** * @param FromQuery $export * @param TemporaryFile $temporaryFile * @param string $writerType * @param int $sheetIndex * @return Collection */ private function exportQuery( FromQuery $export, TemporaryFile $temporaryFile, string $writerType, int $sheetIndex ): Collection { $query = $export->query(); if ($query instanceof \Laravel\Scout\Builder) { return $this->exportScout($export, $temporaryFile, $writerType, $sheetIndex); } $count = $export instanceof WithCustomQuerySize ? $export->querySize() : $query->count(); $spins = ceil($count / $this->getChunkSize($export)); $jobs = new Collection(); for ($page = 1; $page <= $spins; $page++) { $jobs->push(new AppendQueryToSheet( $export, $temporaryFile, $writerType, $sheetIndex, $page, $this->getChunkSize($export) )); } return $jobs; } /** * @param FromQuery $export * @param TemporaryFile $temporaryFile * @param string $writerType * @param int $sheetIndex * @return Collection */ private function exportScout( FromQuery $export, TemporaryFile $temporaryFile, string $writerType, int $sheetIndex ): Collection { $jobs = new Collection(); $chunk = $export->query()->paginate($this->getChunkSize($export)); // Append first page $jobs->push(new AppendDataToSheet( $export, $temporaryFile, $writerType, $sheetIndex, $chunk->items() )); // Append rest of pages for ($page = 2; $page <= $chunk->lastPage(); $page++) { $jobs->push(new AppendPaginatedToSheet( $export, $temporaryFile, $writerType, $sheetIndex, $page, $this->getChunkSize($export) )); } return $jobs; } /** * @param FromView $export * @param TemporaryFile $temporaryFile * @param string $writerType * @param int $sheetIndex * @return Collection */ private function exportView( FromView $export, TemporaryFile $temporaryFile, string $writerType, int $sheetIndex ): Collection { $jobs = new Collection(); $jobs->push(new AppendViewToSheet( $export, $temporaryFile, $writerType, $sheetIndex )); return $jobs; } /** * @param object|WithCustomChunkSize $export * @return int */ private function getChunkSize($export): int { if ($export instanceof WithCustomChunkSize) { return $export->chunkSize(); } return $this->chunkSize; } }
Save Changes
Cancel / Back
Close ×
Server Info
Hostname: server1.winmanyltd.com
Server IP: 203.161.60.52
PHP Version: 8.3.27
Server Software: Apache
System: Linux server1.winmanyltd.com 4.18.0-553.22.1.el8_10.x86_64 #1 SMP Tue Sep 24 05:16:59 EDT 2024 x86_64
HDD Total: 117.98 GB
HDD Free: 59.84 GB
Domains on IP: N/A (Requires external lookup)
System Features
Safe Mode:
Off
disable_functions:
None
allow_url_fopen:
On
allow_url_include:
Off
magic_quotes_gpc:
Off
register_globals:
Off
open_basedir:
None
cURL:
Enabled
ZipArchive:
Enabled
MySQLi:
Enabled
PDO:
Enabled
wget:
Yes
curl (cmd):
Yes
perl:
Yes
python:
Yes (py3)
gcc:
Yes
pkexec:
Yes
git:
Yes
User Info
Username: eliosofonline
User ID (UID): 1002
Group ID (GID): 1003
Script Owner UID: 1002
Current Dir Owner: 1002