将多个图像调整大小操作委派给 Laravel 作业不会加快上传过程
Delegating multiple image resize operations to Laravel job does not speed up upload process
在我们的平台上上传图片时,我一直在尝试为管理员优化用户体验。图片相当大 (7-10MB) 并且一次以 3 个为一组异步上传(使用 FineUploader). Each image is being stored in multiple sizes, using 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 Droplet(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 设置?
首先确保您确实使用 Redis
作为您的队列驱动程序。确保你在 .env
中设置了它,确保它没有缓存在你的配置文件中(运行 php artisan config:clear
或 php artisan config:cache
)。此外,如果您有队列工作器 运行ning,请确保您已重新启动它。
如果不是这样,您应该确定上传需要多少时间以及调整图像大小需要多少时间。您确定上传不需要 13 分钟,调整大小只需 2 分钟吗?
在我们的平台上上传图片时,我一直在尝试为管理员优化用户体验。图片相当大 (7-10MB) 并且一次以 3 个为一组异步上传(使用 FineUploader). Each image is being stored in multiple sizes, using 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 Droplet(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 设置?
首先确保您确实使用 Redis
作为您的队列驱动程序。确保你在 .env
中设置了它,确保它没有缓存在你的配置文件中(运行 php artisan config:clear
或 php artisan config:cache
)。此外,如果您有队列工作器 运行ning,请确保您已重新启动它。
如果不是这样,您应该确定上传需要多少时间以及调整图像大小需要多少时间。您确定上传不需要 13 分钟,调整大小只需 2 分钟吗?