Как сохранить метаданные изображения в Laravel 5.6 - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь сделать галерею изображений.Для этой цели я храню исходные изображения (сейчас около 7000, а в будущем их будет более 60 000) в пути хранения данных.Затем я выполняю задание, которое сохраняет путь и метаданные (размер изображения, разрешение, тип mimetype, ширину и высоту) в дБ.

Проблема в том, что он очень-очень медленный.

это мой контроллер:

 public function startJob() {

        // Start doing Jobs
        CreateDirectories::withChain([
            new RecordPaths,
            // new OptimizeImage,
            // new SendNotification,
        ])->dispatch()->delay(now()->addSeconds(3));
        echo 'create directories and stored paths to database!';
    }

В моем контроллере я выполняю некоторые задания.Сначала он создаст каталог, в котором я храню большие пальцы.После того, как это задание выполнено, следующее - RecordPaths к БД.

И вот проблема, это очень медленно (image / 2sec).

это моя работа:

class RecordPaths implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

        public function handle()
        {
            $this->truncate();

            $files = Storage::disk('gallery')->allFiles();
            foreach($files as $file) {
                $thumb = new Thumb;
                $thumb->brand = explode("/", $file, 2)[0];
                $thumb->name = array_slice(explode("/", $file),-1)[0];
                $thumb->path = $file;
                //
                $thumb->size = $this->imageMetadata($file, 'fileSize');
                $thumb->width = $this->imageMetadata($file, 'imageWidth');
                $thumb->height = $this->imageMetadata($file, 'imageHeight');
                $thumb->mime = $this->imageMetadata($file, 'mimeType');
                //
                $thumb->save();
            }
        }

        public function truncate() {
            return Thumb::truncate();
        }

        public function imageMetadata($file, $type) {
            $metaData = [];
            $metaData['mimeType'] = \Image::make(storage_path("app\public\gallery\\") . $file)->exif('MimeType');
            $metaData['fileSize'] = \Image::make(storage_path("app\public\gallery\\") . $file)->exif('FileSize');
            $metaData['imageWidth'] = \Image::make(storage_path("app\public\gallery\\") . $file)->exif('ExifImageWidth');
            $metaData['imageHeight'] = \Image::make(storage_path("app\public\gallery\\") . $file)->exif('ExifImageLength');
            return $metaData[$type];
        }
    }

$files = Storage::disk('gallery')->allFiles(); в методе handle возвращают это: enter image description here

и мой БД после некоторых вставок: enter image description here

Кто-нибудь знает, как его ускорить?

1 Ответ

0 голосов
/ 14 сентября 2018

Прежде всего, сделайте только один \Image::make вместо 4, затем просто вызовите метод -> exif с параметрами.Во-вторых, замените $thumb->save(); на пакетную вставку.Вы можете использовать библиотеку this или написать собственный код (смотрите this ).PS Это увеличит ваше время выполнения.PSS Также вы можете попробовать использовать фрагменты Laravel или разделить изображения между несколькими рабочими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...