- پشتیبانی از نسخه های
- 2.3
- نیاز به ویرایش مجوزهای گروههای کاربری
- نیست
- مورد نیاز اضافی
- دسترسی SSH یا خط فرمان؛ اجرای اسکریپت از طریق HTTP امکانپذیر نیست.
- PHP نسخهٔ ۸.۰ یا بالاتر؛ همان نسخهای که نصب زنفورو به آن نیاز دارد.
- وجود ستون file_key در جدول xf_attachment_data. اسکریپت هنگام شروع این مورد را بررسی میکند و اگر ستون وجود نداشته باشد، بهجای حدس زدن مسیر فایلها، اجرا را متوقف میکند.
- هنگام استفاده از گزینهٔ --index، حدود ۱۰۰ مگابایت حافظهٔ RAM بهازای هر ۵۰٬۰۰۰ فایل پیوست مورد نیاز است.
- سازگار با ذخیرهسازی محلی و همچنین آداپتورهای Flysystem برای ذخیرهسازی راه دور یا خارج از سرور، مانند S3 و R2.
- نیازی به نصب افزونه ندارد؛ کافی است اسکریپت مستقل را در پوشهٔ اصلی نصب انجمن زنفورو قرار دهید.
بررسی یکپارچگی فایلهای پیوست
وقتی فایل مربوط به یک پیوست حذف میشود، اما رکورد آن در پایگاه داده باقی میماند، زنفورو همچنان پیوند آن پیوست را نمایش میدهد. با کلیک روی پیوند، خطای ۵۰۰ رخ میدهد و گزارش خطاها با پیامهایی مانند نمونهٔ زیر پر میشود:
کد خطا:
زنفورو بهصورت پیشفرض راهی برای پیدا کردن انبوه این موارد ندارد. همچنین نمیتوان بهآسانی تشخیص داد که یک پیوست واقعاً از بین رفته است یا فایل آن همچنان در فضای ذخیرهسازی وجود دارد، اما کلید ذخیرهسازی آن قدیمی شده است.
این مشکل ممکن است پس از بازیابی پایگاه داده، انتقال فضای ذخیرهسازی، ناموفق بودن همگامسازی با S3 یا R2، بازیابی ناقص نسخهٔ پشتیبان یا انباشته شدن حذفهای ناموفق طی چندین سال رخ دهد.
این دستور فقط اطلاعات را بررسی میکند و هیچ تغییری ایجاد نمیکند.
گزینهٔ --index یک بار فهرست بازگشتی فضای ذخیرهسازی را تهیه میکند و پاسخ تمام جستوجوها را از حافظه ارائه میدهد. در فضای ذخیرهسازی راه دور، این کار میتواند حدود ۲۰۰ هزار رفتوبرگشت شبکه را به حدود ۲۰۰ درخواست فهرستگیری کاهش دهد.
گزارش CSV را بررسی کنید. سپس از جداول مربوط به پیوستها نسخهٔ پشتیبان بگیرید:
اصلاح بدون حذف هیچ رکوردی:
اصلاح و پاکسازی رکوردهای مربوط به فایلهای ازبینرفته:
وقتی فایل مربوط به یک پیوست حذف میشود، اما رکورد آن در پایگاه داده باقی میماند، زنفورو همچنان پیوند آن پیوست را نمایش میدهد. با کلیک روی پیوند، خطای ۵۰۰ رخ میدهد و گزارش خطاها با پیامهایی مانند نمونهٔ زیر پر میشود:
کد خطا:
کد:
League\Flysystem\FileNotFoundException: File not found at path: attachments/236/236888-0dcb....data
src/XF/Pub/View/Attachment/View.php:27
این مشکل ممکن است پس از بازیابی پایگاه داده، انتقال فضای ذخیرهسازی، ناموفق بودن همگامسازی با S3 یا R2، بازیابی ناقص نسخهٔ پشتیبان یا انباشته شدن حذفهای ناموفق طی چندین سال رخ دهد.
این
هر پیوست در یکی از سه وضعیت زیر طبقهبندی میشود:- OK — سالم: فایل دقیقاً در مسیری وجود دارد که زنفورو انتظار دارد.
- RELINK — قابل اتصال مجدد: فایل در مسیر مورد انتظار وجود ندارد، اما فایلی با همان data_id و یک file_key متفاوت پیدا شده است که مقدار md5 آن با file_hash ذخیرهشده مطابقت دارد. فایل بارگذاریشده سالم است و فقط ارجاع پایگاه داده به آن قدیمی شده است. این وضعیت بدون از دست رفتن داده قابل اصلاح است.
- MISSING — مفقود: هیچ فایلی وجود ندارد، یا فایل پیداشده مقدار md5 متفاوتی دارد. این تفاوت میتواند به این معنی باشد که شناسه در بارگذاری جدیدتری دوباره استفاده شده و فایل فعلی متعلق به شخص دیگری است. در این حالت، چیزی برای بازیابی وجود ندارد.
سه
- Scan — اسکن: پایگاه داده را بررسی میکند و میپرسد «فایل کجاست؟» سپس گزارش را در قالب CSV ذخیره میکند. این حالت فقط خواندنی است.
- Orphans — فایلهای یتیم: برعکس حالت اسکن عمل میکند؛ فضای ذخیرهسازی را بررسی میکند و میپرسد «این فایل متعلق به کدام رکورد است؟». به این ترتیب، فایلهایی را پیدا میکند که پس از بازگردانی پایگاه داده به نسخهای قدیمیتر، بدون رکورد باقی ماندهاند و اسکن معمولی قادر به شناسایی آنها نیست. این حالت نیز فقط خواندنی است.
- Apply — اعمال تغییرات: گزارش CSV اسکن را دریافت میکند، هر ردیف را دوباره با فضای ذخیرهسازی تطبیق میدهد و سپس اصلاحات را انجام میدهد. حذف فقط در صورت درخواست صریح شما انجام میشود.
نحوهٔ
اسکریپت را در پوشهٔ اصلی انجمن، کنار فایل index.php قرار دهید. سپس دستور زیر را اجرا کنید:
کد:
php xf-missing-attachments.php --index --report=scan.csv
گزینهٔ --index یک بار فهرست بازگشتی فضای ذخیرهسازی را تهیه میکند و پاسخ تمام جستوجوها را از حافظه ارائه میدهد. در فضای ذخیرهسازی راه دور، این کار میتواند حدود ۲۰۰ هزار رفتوبرگشت شبکه را به حدود ۲۰۰ درخواست فهرستگیری کاهش دهد.
گزارش CSV را بررسی کنید. سپس از جداول مربوط به پیوستها نسخهٔ پشتیبان بگیرید:
کد:
mysqldump YOUR_DB xf_attachment xf_attachment_data > attach-backup.sql
کد:
php xf-missing-attachments.php --apply=scan.csv --index
کد:
php xf-missing-attachments.php --apply=scan.csv --index --delete
ملاحظات
از آنجا که این ابزار قابلیت حذف رکوردهای پایگاه داده را دارد، با این فرض طراحی شده است که ممکن است تشخیص آن اشتباه باشد.- اسکن هیچ تغییری ایجاد نمیکند. حذف به اجرای جداگانه، گزینهای مستقل و یک فایل CSV نیاز دارد که پیش از اجرا فرصت بررسی آن را داشتهاید.
- هر رکورد درست پیش از اعمال تغییر، دوباره با فضای ذخیرهسازی واقعی بررسی میشود. بنابراین، یک فایل CSV قدیمی یا ویرایششده بهصورت دستی نمیتواند بهتنهایی باعث آسیب شود.
- اگر فهرست فضای ذخیرهسازی خالی باشد، اجرا متوقف میشود. اگر فضای ذخیرهسازی در دسترس نباشد یا پیشوند مسیر اشتباه تنظیم شده باشد، همهٔ رکوردها بهاشتباه در وضعیت MISSING قرار میگیرند. این وضعیت بحرانی است و گزینهٔ --force نیز آن را نادیده نمیگیرد.
- محدودیت نسبت حذف: اگر برنامه بخواهد بیش از ۲۰ درصد تمام پیوستها را حذف کند، عملیات رد میشود؛ چنین الگویی بیشتر نشاندهندهٔ خرابی فضای ذخیرهسازی است تا از دست رفتن واقعی دادهها.
- محدودیت تعداد حذف: گزینهٔ --max-delete با مقدار پیشفرض 2000 از اجرای برنامههایی با تعداد حذف غیرمنتظره جلوگیری میکند.
- حذف از طریق لایهٔ موجودیتها انجام میشود. به این ترتیب، شمارندهٔ attach_count توسط مدیریتکنندهٔ پیوست زنفورو بهروزرسانی میشود؛ این موضوع انواع محتوا، از جمله محتوای افزونههای دیگر، را نیز در بر میگیرد.
- آرگومانهای ناشناخته رد میشوند و بیسروصدا نادیده گرفته نخواهند شد.
- گزارشها در مسیر قابل دسترسی از طریق وب ذخیره نمیشوند. این گزارشها اطلاعات تمام پیوستهای انجمن را در بر دارند و در مسیر داخلی internal_data/attachment-audit/ ذخیره میشوند.
- اجرای اسکریپت از طریق HTTP ممنوع است.
