من فضلك تسجيل الدخول أو تسجيل لتفعل ذلك.

يُعد الحفاظ على أداء تطبيقات الويب أمرًا بالغ الأهمية، ومن بين التحديات التي تواجه المطورين هي إدارة جلسات المستخدم المنتهية. حتى إصدار Laravel 13.39، كانت تطبيقات Laravel التي تستخدم برامج تشغيل الجلسات القائمة على قاعدة البيانات أو الملفات تعتمد على آلية «اليانصيب» لتنظيف الجلسات القديمة. لكن الأمر تغير الآن، حيث قدم Laravel 13.39 أمر Artisan جديدًا ومخصصًا لهذه المهمة هو `session:garbage-collect`.

لماذا نحتاج هذا الأمر؟

قبل هذا الأمر، كانت جلسات Laravel المنتهية الصلاحية تظل في التخزين إلى أن يقوم Laravel بحذفها أثناء بعض طلبات الويب. كان هذا يتم عبر إعداد «lottery» في ملف `config/session.php`، والذي يعطي كل طلب ويب يبدأ جلسة فرصة (افتراضيًا 2 من 100) لتشغيل عملية التنظيف. هذه العملية كانت تجري قبل أن يصل الطلب إلى المسار المحدد، مما قد يسبب تأخيرًا للعميل في بعض الحالات، وقد لا يكون التنظيف منتظمًا بما فيه الكفاية في التطبيقات ذات حركة المرور المنخفضة.

الآن، ومع الأمر الجديد، يمكن جدولة عملية التنظيف بشكل مستقل عن طلبات الويب، مما يحرر طلبات المستخدمين من انتظار انتهاء عملية التنظيف ويضمن حذف الجلسات القديمة بانتظام.

كيفية الاستخدام والتهيئة

لاستخدام الأمر، يمكنك جدولته ضمن `routes/console.php` ليتم تشغيله بشكل منتظم، على سبيل المثال كل ساعة:

php
use Illuminate\Support\Facades\Schedule;

Schedule::command(‘session:garbage-collect’)->hourly();

بمجرد جدولة الأمر، يجب تعطيل آلية «اليانصيب» لمنع طلبات الويب من محاولة القيام بنفس التنظيف. يمكنك القيام بذلك بتعيين القيمة الأولى في مصفوفة `lottery` إلى `0` في ملف `config/session.php`:

php
‘lottery’ => [0, 100],

نقطة مهمة: برامج تشغيل الجلسات مثل `redis` و`memcached` و`dynamodb` و`apc` و`cookie` لا تحتاج إلى هذا الأمر لأنها تعالج انتهاء صلاحية الجلسات تلقائيًا.

إذا كان تطبيقك يعمل على عدة خوادم ويستخدم برنامج تشغيل قاعدة البيانات، فننصح باستخدام `->onOneServer()` مع أمر الجدولة، بحيث يتم تشغيل التنظيف من خادم واحد فقط ويحتاج هذا إلى مخزن مؤقت مشترك للقفل. أما مع برنامج تشغيل الملفات، فيجب تشغيل الأمر على كل خادم ما لم يكن دليل الجلسات على وحدة تخزين مشتركة.

للمشاريع الأقدم من Laravel 13.39

إذا كنت تعمل على إصدار Laravel 13.38 أو أقدم، فإن الأمر `session:garbage-collect` لن يكون متاحًا. ومع ذلك، لا يزال بإمكانك تحقيق نفس الوظيفة عن طريق جدولة استدعاء دالة `closure` تقوم بتشغيل طريقة `gc()` على مدير الجلسات:

php
use Illuminate\Support\Facades\Schedule;

Schedule::call(function () {
app(‘session’)->driver()->getHandler()->gc((int) config(‘session.lifetime’) * 60);
})->name(‘delete-expired-sessions’)->hourly()->onOneServer();

هذا الحل يعمل مع إصدارات Laravel 11 و12 و13. يجب ضرب قيمة `session.lifetime` بـ `60` لأن `gc()` تتوقع المدة بالثواني وليس الدقائق. وتذكر تعطيل «lottery» كما هو موضح أعلاه.

ما الذي يعنيه هذا للمطورين؟

بالنسبة للمطورين، هذا التحديث يعني تحكمًا أفضل في دورة حياة الجلسات وتحسينًا محتملًا في أداء التطبيق. بإلغاء تحميل مهمة تنظيف الجلسات من طلبات الويب، يمكن للمطورين ضمان تجربة مستخدم أكثر سلاسة وتقليل أوقات الاستجابة. كما أنه يقلل من استهلاك الموارد غير الضرورية التي تشغلها الجلسات المنتهية في التخزين، مما يؤدي إلى إدارة أفضل للموارد.

المصدر: laravel-news.com

Kotlin 2.5.0-Beta2، KotlinConf 2027، ونتائج Shipaton 2026
Cloudflare توسع حماية تطبيقات الويب إلى المنشآت الخاصة

Reactions

0
0
0
0
0
0
بالفعل كان رد فعل لهذا المنصب.

ردود الفعل