تكرار السؤال: …
الإجابة المختصرة
تقفل PHP ملف الجلسة للمستخدم حصرياً طوال فترة تنفيذ الطلب لمنع تضارب البيانات؛ وتحل المشكلة باستدعاء session_write_close() فور الانتهاء من قراءة وتعديل الجلسة.
الشرح
عند استدعاء session_start()، تحجز PHP قفلاً حصرياً (Exclusive Lock) على ملف الجلسة الخاص بذلك المستخدم. إذا فتح المستخدم عدة تبويبات أو أرسل عدة طلبات AJAX متزامنة، ستعلق كل الطلبات اللاحقة في طابور انتظار حتى ينتهي الطلب الأول من التنفيذ تماماً. استدعاء session_write_close() يحرر القفل فوراً ويسمح للطلبات المتزامنة بالعمل بالتوازي.
مثال بالكود
session_start();
$userId = $_SESSION['user_id'];
// تحرير القفل فوراً حتى لا تعطل الطلبات المتزامنة الأخرى
session_write_close();
// تنفيذ عمليات الـ I/O الطويلة بأمانأخطاء شائعة
- ترك الجلسة مقفلة أثناء تنفيذ عمليات خارجية طويلة مثل استدعاءات الـ APIs الخارجية.