ما هو Thread Safe و Non-Thread Safe في PHP؟ شرح نهائي وشامل
\n\nإذا سبق لك تثبيت PHP على نظام Windows أو إعداد خادم ويب، فلا بد أنك صادفت الاختصارات الغامضة TS و NTS في أسماء حزم التثبيت. أو ربما قرأت تحذيرات في التوثيق الرسمي تقول: "اختر الإصدار thread-safe أو non-thread-safe". وهنا يتبادر إلى الذهن سؤال: "ما هذا بحق السماء؟ وماذا يحدث إذا اخترت الإصدار الخطأ؟"
\n\nهذه المقالة هي دليلك الشامل في عالم أمان الخيوط في PHP. سنشرح الفرق بين إصداري thread safe (TS) و non-thread safe (NTS)، ومتى تحتاج كل منهما، وكيف تتجنب مشاكل عدم توافق الإضافات. هيا بنا!
\n\nباختصار: ما هو أمان الخيوط (Thread Safety)؟
\n\nتخيل أن PHP هو طباخ في مطبخ. وكل طلب يصل إلى موقعك هو طلب جديد من الزبائن. في وضع non-thread safe، كل طلب يحضره طباخ منفصل في مطبخه الخاص. لا يتداخلون مع بعضهم البعض، لأن لكل طباخ أدواته ومكوناته الخاصة. لا ذاكرة مشتركة — ولا تعارضات.
\n\nفي وضع thread safe، لديك طباخ واحد ولكنه يعمل بعدة أيادٍ (خيوط). كل الأيادي تتشارك نفس المطبخ، نفس الأدوات، ونفس الذاكرة. وهنا يكمن التحدي — ألا تمسك يدان بنفس السكين في نفس الوقت. لمنع ذلك، نحتاج إلى أقفال وتزامن — وهذا هو أمان الخيوط (thread safety).
\n\nبكلمات بسيطة: Thread Safe (TS) — PHP قادر على العمل في بيئة متعددة الخيوط، حيث تعالج عملية واحدة عدة طلبات في وقت واحد. Non-Thread Safe (NTS) — PHP يعمل في وضع أحادي الخيط، حيث كل طلب هو عملية منفصلة.
\n\nمتى ولماذا ظهرت إصدارات TS و NTS؟
\n\nتاريخياً، تطور PHP كإضافة لخادم Apache (mod_php). Apache يعمل بطريقتين: prefork (عملية لكل طلب) و worker (عملية واحدة مع خيوط متعددة). بالنسبة لـ prefork، أمان الخيوط غير ضروري — كل طلب معزول. أما بالنسبة لـ worker، فهو أمر حيوي.
\n\nلاحقاً، مع ازدياد شعبية FastCGI (PHP-FPM) و Nginx، أصبح واضحاً: في هذه السيناريوهات، لا يتم استخدام تعدد الخيوط داخل PHP. FastCGI يشغل عمليات منفصلة، وكل منها يعمل بشكل مستقل. فلماذا تحمل عبء كود الأقفال الثقيل؟ هكذا ظهرت حزم non-thread safe الخفيفة.
\n\nكيف تعرف أي إصدار PHP مثبت لديك؟
\n\nأسهل طريقة — شغّل الأمر التالي في الطرفية أو في ملف PHP:
\n\n<?php\nphpinfo();\n?>\n\nابحث عن السطر Thread Safety. إذا كان مكتوباً enabled — فأنت تستخدم إصدار TS. إذا كان disabled — فأنت تستخدم NTS.
\n\nالطريقة الثانية — انظر إلى مخرجات الأمر php -i | findstr "Thread" (في Windows) أو php -i | grep Thread (في Linux/macOS).
الفرق في أسماء حزم التثبيت
\n\nعلى الموقع الرسمي windows.php.net، ستجد أسماء مثل:
\n\n- \n
- php-8.3.0-Win32-vs16-x64.zip — عادةً ما يكون هذا إصدار NTS (لكن تأكد من الوصف) \n
- php-8.3.0-Win32-vs16-x64-ts.zip — وهذا هو إصدار TS، حيث يحتوي الاسم على
-ts\n
في توزيعات Linux، عادةً لا يتم فصل الإصدارات — يُستخدم ملف ثنائي واحد مُجمّع مع دعم الخيوط (ZTS — Zend Thread Safety)، ولكن تعدد الخيوط يُفعّل فقط عند استخدام Apache worker.
\n\nسيناريوهات عملية: متى تختار TS ومتى تختار NTS؟
\n\nالسيناريو 1: Apache + mod_php (worker MPM)
\n\nإذا كنت تستخدم Apache مع worker أو event MPM (الأنماط متعددة الخيوط) — فأنت بحاجة ماسة إلى إصدار TS من PHP. وإلا — ستواجه أخطاء فادحة، وتعطل الخادم، وفقدان البيانات. سيبدو الأمر كالتالي