مطالعه موردی مهندسی
محافظ Autoload گزینهها
هر درخواست وردپرس قبل از هر چیز آپشنهای autoload را در حافظه میخواند. وقتی افزونهها شروع میکنند ترنزینتها را با autoload=yes بنویسند، این بار بیسروصدا رشد میکند تا جایی که تولید صفحه بدون دلیل ظاهری کند میشود.
مسئله تجاری
چند افزونه روی فروشگاه ترنزینتهایشان را با autoload=yes در wp_options مینوشتند. آپشنهای autoload در هر درخواست خوانده میشوند، کش باشد یا نباشد، پس چند هزار ردیف ترنزینت سرگردان تبدیل میشود به وزن حافظه و کوئری روی هر بازدید صفحه. هزینه واقعی است ولی هیچوقت به شکل خطا خودش را نشان نمیدهد و دقیقاً به همین دلیل ماهها زنده میماند.
آنچه تحویل دادم
- mu-options-autoload-guard.php که هر ردیف ترنزینتی را با autoload=yes پیدا کند به no برمیگرداند و کار دیگری نمیکند.
- یک قفل اجرای روزییکبار در یک site transient، طوری که گارد روی هر درخواست یک خواندن کششده هزینه دارد ولی در ۲۴ ساعت فقط یک بار به دیتابیس دست میزند.
- یک شمارش پایشی جدا که وقتی کل جمعیت autoload=yes از ۴٬۰۰۰ ردیف رد شد لاگ میکند، پشت یک ثابت نگه داشته شده تا در حالت عادی خاموش بماند.
رویکرد فنی
- آپدیت اصلاحی فقط وقتی اجرا میشود که COUNT(*) قبلی حداقل یک ردیف متخلف پیدا کرده باشد، پس یک سایت سالم فقط هزینهی شمارش را میدهد و بس.
- به wp_loaded با اولویت ۵۰ وصل میشود؛ بهقدر کافی دیر که افزونههایی که حین بوت ترنزینت مینویسند کارشان را کرده باشند.
- کوئری پایش ستون ایندکسشدهی autoload را میشمارد نه حجم ردیف را، که آن را بهقدری ارزان نگه میدارد که کنار پاس اصلاحی اجرا شود.
- لاگ بهطور پیشفرض با یک ثابت خاموش است، چون گاردی که در هر اجرا به error_log مینویسد خودش نوعی نویز میشود.
نتیجه و شواهد
ردیفهای ترنزینت دیگر در مجموعهی autoload انباشته نمیشوند. این یک کنترل پیشگیرانه است نه یک اصلاح یکباره: هر روز هرچه افزونههای نصبشدهی فعلی اشتباه انجام میدهند را تصحیح میکند، بدون اینکه لازم باشد بعد از هر آپدیت تکتکشان را ممیزی کنم.
اهمیت برای کارفرما
آپدیت افزونهها مرتب این باگ را دوباره وارد میکنند. اجرای قانون در کد بهجای دستی درست کردن جدول یعنی یک ریلیز بد بهجای یک هفته کندی بیدلیل، یک روز انحراف هزینه دارد.
خلاصه اجرایی خوانا
خلاصه_اجرایی {
پروژه: "Options Autoload Guard"
فایل: "mu-plugins/mu-options-autoload-guard.php (۴۳ خط)"
ثابت: "هیچ ردیف _transient_ نباید autoload = yes باشد"
هوک: "wp_loaded، اولویت ۵۰"
محدودیت_نرخ: "قفل site transient، یک پاس DB در ۲۴ ساعت"
هشدار: "لاگ وقتی مجموع autoload=yes از ۴۰۰۰ رد شود"
پیشفرض: "لاگ خاموش؛ اصلاح همیشه روشن"
}ارزش حرفهای این پروژه
بیشتر ارزش این افزونه در کاری است که انجام نمیدهد. جدول options را تمیز نمیکند، دیداپلیکیت نمیکند، بهینه نمیکند؛ دقیقاً یک ثابت را اجرا میکند.
گاردهای کوچک و تکمنظورهی اینشکلی راحت بازبینی میشوند، راحت حذف میشوند و سخت اشتباه از آب درمیآیند. برای زیرساختی که روی هر درخواست اجرا میشود معمولاً همین شکل درست است.