如何在Laravel 5.6中保存图像元数据

时间:2018-09-13 18:27:24

标签: php laravel-5

我正在尝试制作图片库。为此,我将原始图像(现在大约为7000,将来将超过60.000)存储在存储laravel路径中。 接下来,我要做一份工作,将路径和元数据(图像大小,分辨率,mimetype,宽度和高度)存储到db。

问题在于它非常非常慢。

这是我的控制器:

 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!';
    }

在我的控制器中,我做了一些工作。 首先,它将创建一个目录,供我存储拇指。完成这项工作后,下一个是到数据库的RecordPath。

这是一个非常慢的问题(图像/ 2秒)。

这是我的工作:

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];
        }
    }

handle方法中的$files = Storage::disk('gallery')->allFiles();返回以下内容: enter image description here

和我的数据库经过一些插入后: enter image description here

有人知道如何加快速度吗?

1 个答案:

答案 0 :(得分:0)

首先只执行一个\Image::make而不是4,然后仅使用参数调用-> exif方法。 其次,将$thumb->save();替换为批量插入。您可以使用this库或编写自己的代码(外观为this)。 附言这会增加您的执行时间。 P.S.S.另外,您可以尝试使用laravel块或在少数工作人员之间分割图像。