پکیج Laravel Storage Dedupler که توسط Khimusov Maxim توسعه یافته است، از هشهای SHA-1 برای جلوگیری از ذخیرهسازی فایلهای تکراری استفاده میکند. وقتی کاربران یک سند یکسان را برای چند پست مختلف آپلود میکنند، هر پست لینک پیوست اختصاصی خود را به یک فایل مشترک دریافت میکند.
حذف دادههای تکراری (Deduplication) فقط برای فایلهایی اعمال میشود که از طریق Dedupler ذخیره میشوند. نصب این پکیج فراخوانیهای موجود متدهای ذخیرهسازی لاراول را تغییر نمیدهد و فایلهای تکراری موجود روی دیسک را پاک نمیکند.
ذخیرهسازی فایلها بدون همپوشانی و تکرار
نمای ساختگی (Facade) Dedupler فایلهای آپلود شده، مسیرهای محلی و محتوای خام را میپذیرد. این مثال محتوای یکسانی را تحت دو نام فایل مختلف ذخیره میکند:
use Maxkhim\Dedupler\Facades\Dedupler;
$content = 'Notes for the November release.';
$first = Dedupler::storeFromContent($content, 'release-notes.txt');
$second = Dedupler::storeFromContent($content, 'notes-copy.txt');
if ($first === null || $second === null) {
throw new RuntimeException('Could not store the release notes.');
}
$first->id === $second->id; // trueاین پکیج محتوا را هش میکند و قبل از نوشتن فایل جدید، به دنبال یک رکورد موجود UniqueFile میگردد. مطابقت داشتن هش، همان رکورد را برمیگرداند، حتی اگر نام فایل ورودی متفاوت باشد. هش SHA-1 همچنین به عنوان کلید اصلی (Primary Key) رکورد عمل میکند.
برای آپلودها، از Dedupler::storeFromUploadedFile($file) استفاده کنید. برای فایلی که از قبل روی سرور موجود است، از Dedupler::storeFromPath($absolutePath) بهره ببرید. متدهای ذخیرهسازی ممکن است در صورت نامعتبر بودن منبع یا خطای ذخیرهسازی مقدار null را برگردانند، بنابراین قبل از دسترسی به ویژگیهای آن، نتیجه را بررسی کنید.
اگر از یک رابط آپلود مانند FilePond در لاراول استفاده میکنید، شیء UploadedFile لاراول دریافتی توسط برنامه خود را به Dedupler پاس دهید.
پیوست کردن فایلها به مدلهای Eloquent
صفت (Trait) Deduplable را به مدلی که نیاز به پیوست دارد اضافه کنید:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Maxkhim\Dedupler\Traits\Deduplable;
class Post extends Model
{
use Deduplable;
}از یک مدل ذخیرهشده استفاده کنید تا پکیج یک شناسه مدل (Model ID) برای ارتباط با فایل داشته باشد:
use App\Models\Post;
$request->validate([
'attachment' => ['required', 'file'],
]);
$post = Post::findOrFail($postId);
$file = $post->storeUploadedFile($request->file('attachment'));
if ($file === null) {
throw new RuntimeException('Could not store the attachment.');
}
$anotherPost = Post::findOrFail($anotherPostId);
$anotherPost->attachUniqueFile($file->id);پست دوم بدون آپلود نسخه دیگری، از طریق هش به فایل موجود ارجاع میدهد. جدول پیوستها نوع مدل و شناسه آن را ثبت میکند تا کلاسهای مختلف مدل نیز بتوانند یک فایل را به اشتراک بگذارند.
این صفت همچنین متدهای storeLocalFile() و storeContentFile() را ارائه میدهد. وقتی فایلی را از طریق مدل ذخیره میکنید، Dedupler نام فایل اصلی و وضعیت آن را در رکورد پیوست ذخیره میکند. پیوست کردن از طریق هش وضعیت را تنظیم میکند اما نام فایل اصلی را کپی نمیکند؛ شما میتوانید آن را در آرگومان دوم متد attachUniqueFile() ارسال کنید.
جدا کردن پیوستهای به اشتراک گذاشته شده
پیوست یک پست را با استفاده از هش فایل آن حذف کنید:
$post->detachUniqueFile($file->id);اگر مدل دیگری همچنان به فایل ارجاع داشته باشد، Dedupler آن را نگه میدارد. جدا کردن آخرین پیوست به صورت پیشفرض هم فایل ذخیرهشده و هم رکورد UniqueFile آن را حذف میکند. اگر برنامه شما باید اسناد را پس از حذف پیوستها توسط کاربران نگه دارد، قبل از استفاده از متد detach این رفتار را بررسی کنید.
نصب و تحلیل فایلهای قدیمی
این پکیج از PHP ^8.2 و لاراول نسخه ۱۰، ۱۱، ۱۲ و ۱۳ پشتیبانی میکند. آن را با Composer نصب کرده و سپس دستور نصب آن را اجرا کنید:
composer require maxkhim/laravel-storage-dedupler
php artisan dedupler:installدستور نصب، مایگریشنهای پکیج را اجرا کرده و سپس جداول دیتابیس و پیکربندی ذخیرهسازی را بررسی میکند. دیسک پیشفرض deduplicated است که به عنوان یک دیسک محلی خصوصی در storage/app/deduplicated پیکربندی شده است. پکیج Dedupler عملیات نوشتن را از طریق API ذخیرهسازی لاراول انجام میدهد. برای اطلاعات بیشتر درباره پیکربندی دیسکهای ریموت، راهنمای ما درباره استفاده از AWS S3 برای ذخیرهسازی لاراول را ببینید.
برای بررسی یک دایرکتوری محلی موجود، دستور زیر را اجرا کنید:
php artisan dedupler:analyse-legacy /absolute/path/to/legacy/storage/directoryاین دستور دایرکتوری و زیردایرکتوریهای آن را برای پیدا کردن هشهای مطابق SHA-1 اسکن میکند. سپس تعداد فایلهای تکراری و تخمینی از میزان صرفهجویی در فضای ذخیرهسازی را گزارش میدهد. این دستور فایلها را منتقل یا حذف نمیکند.
میتوانید سورس کد و مستندات استفاده را در مخزن گیتهاب Laravel Storage Dedupler پیدا کنید. این پکیج تحت مجوز MIT منتشر شده است.
دیدگاهها و نقدها
دیدگاه خود را درباره این تحلیل با دیگر خوانندگان به اشتراک بگذارید.
ارسال دیدگاه جدید
هنوز دیدگاهی برای این مقاله ثبت نشده است.
نخستین نفری باشید که دیدگاه یا نقد خود را درباره این موضوع مینویسد.