laravel图库优化



我有照片库页面,其中显示了来自给定目录的所有文件。我有以下处理图片的逻辑:

  • 原始图片我保存在storage/app/img
  • 使用控制台命令和InterventionImage库我创建拇指-在public/thumbs_md我保持小拇指约300x300和在public/thumbs_lg我保持相同的图片,但1024x768。

我对画廊页面的想法是,我从thumbs_md内的给定目录中找到所有文件,并将它们显示为指向thumbs_lg内具有相同名称的文件的链接的拇指。每张图片都应该有描述,我使用InterventionImage库从$image->exif('ImageDescription')中获取。并在页面上分页20张图片的结果。它工作得很好,在目录中少于200张图片,但当它是nginx给我504网关超时。我从exif的描述中找到了原因。EXIF信息仅存储在storage/app/img内的原始源图片中。在拇指生成过程中,EXIF被删除。我找不到保存它的方法。也许这就是为什么我得到"网关超时"的主要原因。我想我有两个问题:

  1. 从大源文件而不是从拇指获取EXIF需要更长的时间,但我不知道如何将EXIF数据从源图像复制到拇指。
  2. 我一次从目录中的所有文件中检索exif数据,但我不知道如何将其分割成块,因为我必须立即给所有元素分页器

目前我只是评论代码,我从所有文件中读取EXIF,没有问题,但我想得到这些描述,我真的不想在数据库中保留图像描述。我喜欢它是图像的一部分。是否有一种方法来优化我的代码?

控制器

public function item($slug)
{
$files = Storage::disk('storage')->allFiles('thumbs_md/'.$slug);
$links = Storage::disk('storage')->allFiles('thumbs_lg/'.$slug);
if ( empty($files) ){
abort(404);
}
// generate title of the page
try  { 
$image = Image::make( '/var/www/storage/app/img/categories/'. $slug.'.jpg'); 
}
catch(NotReadableException $e)
{
// If error
$title = 'Picture not found';
}
// If no error ...
$title = $image->exif('ImageDescription');

// generate description for picture
$ImageDescription = function($value) {
try  { $image = Image::make(str_replace('thumbs_md', '/var/www/storage/app/img', $value)); }
catch(NotReadableException $e)
{
// If error
return 'Picture not found';
}
// If no error ...
return $image->exif('ImageDescription');
};
//$imgDesc = array_map($ImageDescription, $files); 
for ($i=0; $i < count($files); $i++) {
$items[$i]['thumb'] = $files[$i];
$items[$i]['link'] = $links[$i];
//$items[$i]['description'] = $imgDesc[$i];
}
$items = Arr::arrayToObject($items); 
$items = collect($items)->mypaginate($perPage = 20);
$items->title = $title;
$items->slug  = $slug;

return view('pages.gallery.item', compact('items'));
}
<<p>视图/strong>
<div class="gallery">
@foreach ($items as $item)
<a href="/storage/{{ $item->link }}" class="lightGallery"> 
<img {{-- alt="{{ $item->description }}" --}} src="/storage/{{ $item->thumb }}">
{{-- <p>{{ $item->description }}</p> --}}
</a>
@endforeach
</div>

我不明白为什么不把这些东西放在数据库中,因为您已经清楚地表明从大文件中检索EXIF数据很慢。你不希望在每次加载页面时都做繁重的工作。

您还可以轻松地过滤数据,只要它不在数据库表中。

代码你目前写得很糟糕,不性能(你正在检索页面标题从图像???),所以要去的方式是设计一些数据库表来处理这个:)。一旦完成,我打赌你可以把这个控制器缩小到7行以下。

在请求过程中应尽可能避免密集或耗时的处理,以获得更好的用户体验。

优化工作流程的一种方法是:

为目录

创建数据库表创建列

image_categories
  • 名称(字符串)
  • 蛞蝓(字符串)(独特的)
  • title(string): exif('ImageDescription')或任何值
  • exif(text):如果需要,分类图像的整个exif数据

为Images创建数据库表创建列为

images
  • image_category(string):用于图像类别
  • src(string):原始图像的路径
  • src_thumb_md(string): thumb_md(300 x 300)图像的路径
  • src_thumb_lg(string): thumb_lg(1024 x 768)图像的路径
  • 描述(string): exif (ImageDescription)
  • exif(text):如果需要,图像的整个exif数据
为图像创建缩略图时存储数据

将用于生成缩略图的控制台命令扩展到

  • 将所有图像的路径和出口数据存储到images
  • 在为
  • 类别存储图像时,将标题和出口数据存储到image_categories表中
定义带有关系的Image和ImageCategory模型(可选)
class ImageCategory extends Model
{
public function images()
{
return $this->hasMany(ImageCategory::class, 'image_category');
}
}
class Image extends Model
{
public function imageCategory()
{
return $this->belongsTo(ImageCategory::class, 'image_category', 'slug');
}
}
控制器,视图h5> 果模型被定义
public function item($slug)
{
$category = ImageCategory::where('slug', $slug)->first();
$images = $category->images()->paginate(20);
return view('pages.gallery.item', compact('category', 'images'));
}

或者当模型没有定义时

public function item($slug)
{
$category = DB::tables('image_categories')->where('slug', $slug)->first();
$images = DB::table('images')->where('image_category', $slug)->paginate(20);
return view('pages.gallery.item', compact('category', 'images'));
}
<div class="gallery">
<h1>{{ $category->title }}</h1>
@foreach ($images as $image)
<a href="/storage/{{ $image->src_thumb_lg }}" class="lightGallery"> 
<img {{-- alt="{{ $image->description }}" --}} src="/storage/{{ $image->src_thumb_md }}">
{{-- <p>{{ $image->description }}</p> --}}
</a>
@endforeach
<!-- Pagination links -->
{{ $images->links() }}
</div>

相关内容

  • 没有找到相关文章

最新更新