Thread Safe و Non-Thread Safe في PHP: دليل شامل لاختيار الإصدار الصحيح

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو 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

الفرق في أسماء حزم التثبيت

\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
\n\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. وإلا — ستواجه أخطاء فادحة، وتعطل الخادم، وفقدان البيانات. سيبدو الأمر كالتالي

المدونات

توصيات الكتب