在我们的平台上传图片时,我一直在尝试优化用户体验或管理员。图像相当重(7-10MB),并且一次一批地上传3个(使用FineUploader)。每张图片都使用Intervention Image以多种尺寸存储。
原始逻辑
<?php
$file = $request->file('qqfile'); // A big JPG file in the request
$image = Image::make($file); // Building an Intervention Image object
$sizes = array(2560, 1980, 1366, 1024, 768, 480, 320);
foreach ($sizes as $size) {
$image = $image->widen($size->width);
Storage::put('public/image_'.$size.'.jpg', $image->encode('jpg', 90));
// image_2560.jpg, image_1980.jpg, etc.
}
我们当前的服务器是一个小型DigitalOcean液滴(512MB RAM,1个vCPU)。考虑到所有事情,上传过程非常耗时(例如,3张图片上传约2分钟)。
优化版
为了加快管理员的流程,我决定在上传请求期间仅存储最大尺寸,然后使用Laravel queues(Redis)委派存储其余尺寸:
<?php
$file = $request->file('qqfile'); // A big JPG file in the request
$image = Image::make($file); // Building an Intervention Image object
$sizes = array(2560, 1980, 1366, 1024, 768, 480, 320);
foreach ($sizes as $size) {
if ($size == 2560) {
// Store the biggest size: image_2560.jpg
$image = $image->widen($size->width);
Storage::put('public/image_'.$size.'.jpg', $image->encode('jpg', 90));
} else {
// Delegate the job to store a resized image, 15 minutes from now
ProcessImageStoring::dispatch($size)->delay(Carbon::now()->addMinutes(15));
}
}
ProcessImageStoring
工作正常。它找到已存储的 2560px 图像,并使用它来存储调整大小的版本。
问题在于 - 即使作业延迟15
分钟 - 上传过程也没有加快。我不明白为什么。单个上传请求需要调整大小并存储 1个图像而不是7个,其他6个应该在15分钟内处理。
有什么想法吗?难道它只是一般的液滴力量吗?任何可能限制性能的PHP / Nginx设置?
答案 0 :(得分:1)
首先确保您确实使用Redis
作为队列驱动程序。确保将其设置在.env
中,确保它未在配置文件中缓存(运行php artisan config:clear
或php artisan config:cache
)。如果您的队列工作程序正在运行,请确保已重新启动它。
如果不是这样,您应该确保上传多长时间以及图像大小调整需要多长时间。你确定上传不需要13分钟,只需要调整大小2分钟吗?