ضبط أداء PHP 8: شرح OpCache و JIT
يبدو تطبيق PHP 8 الخاص بك بطيئًا تحت الضغط. لقد قمت بتحسين الاستعلامات وإضافة التخزين المؤقت، لكن أوقات الاستجابة لا تزال متأخرة. قد يكون السبب هو الحمل الزائد لتنفيذ PHP نفسه. ميزتان قويتان - OpCache و JIT - يمكنهما تسريع الكود الخاص بك بشكل كبير، ولكن فقط إذا تم تكوينهما بشكل صحيح. يشرح هذا الدليل كيفية عملهما وكيفية ضبطهما لأحمال العمل الواقعية.
ما هو OpCache ولماذا هو مهم
PHP هي لغة تفسيرية: كل طلب عادةً ما يقوم بتحليل وتصريف ملفات المصدر الخاصة بك إلى bytecode قبل التنفيذ. يقوم OpCache بتخزين bytecode المترجم في الذاكرة المشتركة، بحيث تتخطى الطلبات اللاحقة مرحلة التحليل والتصريف. النتيجة؟ انخفاض استخدام وحدة المعالجة المركزية وأوقات استجابة أسرع.
OpCache ممكّن افتراضيًا في العديد من إعدادات الإنتاج، لكن الإعدادات الافتراضية متحفظة. يمكن أن يؤدي ضبطه إلى تحسين الإنتاجية بمقدار 2-3 مرات للتطبيقات التي تعتمد على وحدة المعالجة المركزية.
توجيهات تكوين OpCache الرئيسية
- opcache.enable: اضبطه على 1 للتمكين. (الافتراضي: 1 في الإنتاج، 0 في CLI ما لم يتم تجاوزه.)
- opcache.memory_consumption: حجم الذاكرة المشتركة بالميجابايت. ابدأ بـ 128 ميجابايت؛ قم بزيادته إذا رأيت
opcache.memory_usageمرتفعًا. - opcache.max_accelerated_files: الحد الأقصى لعدد الملفات المخزنة مؤقتًا. اضبطه على رقم أولي أكبر من إجمالي ملفات PHP الخاصة بك (مثل 10007).
- opcache.validate_timestamps: عندما يكون 1، يتحقق PHP من الطوابع الزمنية للملفات بحثًا عن التغييرات. اضبطه على 0 في الإنتاج لتجنب استدعاءات stat؛ يجب عليك مسح ذاكرة التخزين المؤقت يدويًا بعد عمليات النشر.
- opcache.revalidate_freq: عدد المرات (بالثواني) للتحقق من الطوابع الزمنية إذا كان validate_timestamps=1. اضبطه على 0 للتطوير، و60+ للإنتاج.
- opcache.interned_strings_buffer: الذاكرة للسلاسل النصية الداخلية (بالميجابايت). قم بزيادتها إلى 16 أو 32 للتطبيقات الكبيرة.
- opcache.fast_shutdown: مهمل في PHP 7.2+، تمت إزالته في PHP 8.0. تجاهله.
- opcache.preload: مسار إلى برنامج نصي للتحميل المسبق (PHP 7.4+). التحميل المسبق يقوم بتصريف وتخزين الملفات مؤقتًا عند بدء التشغيل، مما يلغي الحمل الزائد لكل طلب للفئات الحرجة.
إعدادات OpCache الموصى بها للإنتاج
; php.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.interned_strings_buffer=32
opcache.preload=/path/to/preload.php
opcache.preload_user=www-data
بعد تغيير الإعدادات، أعد تشغيل PHP-FPM. راقب باستخدام opcache_get_status() للتحقق من معدل الإصابة واستخدام الذاكرة.
فهم JIT في PHP 8
الترجمة الفورية (JIT) تأخذ OpCache خطوة إلى الأمام: فهي تقوم بتصريف bytecode إلى كود آلة أصلي في وقت التشغيل. يمكن أن يؤدي ذلك إلى تسريع المهام كثيفة الاستخدام لوحدة المعالجة المركزية مثل العمليات الحسابية الرياضية بشكل كبير، لكنه لا يفعل الكثير لطلبات الويب النموذجية التي يهيمن عليها الإدخال/الإخراج (قاعدة البيانات، نظام الملفات، الشبكة).
JIT جزء من OpCache، لذا يجب عليك تمكين OpCache أولاً. في PHP 8، يتم تكوين JIT عبر opcache.jit و opcache.jit_buffer_size.
توجيهات تكوين JIT
- opcache.jit: يتحكم في وضع JIT. استخدم
tracing(الافتراضي) أوfunction. القيمة هي رمز CRTO المكون من 4 أرقام:CRTOحيث C=تحسين خاص بوحدة المعالجة المركزية، R=تخصيص السجلات، T=الزناد، O=مستوى التحسين. لمعظم التطبيقات،opcache.jit=tracingجيد. - opcache.jit_buffer_size: الذاكرة لكود JIT بالبايت. ابدأ بـ 64M أو 128M. إذا تم ضبطه على 0، يتم تعطيل JIT.
- opcache.jit_hot_loop، opcache.jit_hot_func، opcache.jit_hot_return، opcache.jit_hot_side_exit: عتبات لاكتشاف الكود الساخن. عادةً ما تكون الإعدادات الافتراضية جيدة.
إعدادات JIT الموصى بها
opcache.jit=tracing
opcache.jit_buffer_size=128M
ملاحظة: يعمل JIT فقط مع تمكين OpCache. في CLI، قد تحتاج إلى ضبط opcache.enable_cli=1 لاختبار JIT.
OpCache مقابل JIT: متى تستخدم أيًا منهما
| الميزة | OpCache | JIT |
|---|---|---|
| الفائدة الأساسية | يخزن bytecode المترجم مؤقتًا | يترجم bytecode إلى كود أصلي |
| الأفضل لـ | جميع تطبيقات PHP | البرامج النصية كثيفة الاستخدام لوحدة المعالجة المركزية وطويلة التشغيل |
| التأثير على التطبيقات المعتمدة على الإدخال/الإخراج | عالي (يقلل التحليل/التصريف) | منخفض إلى معدوم |
| الحمل الزائد للذاكرة | متوسط | مخزن مؤقت إضافي |
| التعقيد | منخفض | متوسط |
دليل الضبط خطوة بخطوة
- تمكين OpCache باستخدام الإعدادات الموصى بها أعلاه.
- مراقبة OpCache باستخدام
opcache_get_status()أو أدوات مثل OpCache GUI. استهدف معدل إصابة أعلى من 99%. - ضبط الذاكرة إذا كان
opcache.memory_usageقريبًا من الحد. - النظر في التحميل المسبق للأطر الكبيرة (Laravel، Symfony). أنشئ برنامجًا نصيًا للتحميل المسبق يتطلب الفئات المستخدمة بشكل متكرر.
- تمكين JIT فقط إذا كان تطبيقك كثيف الاستخدام لوحدة المعالجة المركزية. اختبر مع وبدون JIT لقياس التأثير.
- قياس الأداء باستخدام أدوات مثل
ab،wrk، أوsiege. قارن الطلبات في الثانية وزمن الاستجابة. - انشر التغييرات تدريجيًا وراقب سجلات الأخطاء بحثًا عن مشكلات.
المزالق الشائعة وأفضل الممارسات
- لا تعطل validate_timestamps في التطوير: ستضيع الوقت في التساؤل عن سبب عدم تفعيل تغييرات الكود.
- امسح OpCache عند النشر: إذا كان validate_timestamps=0، يجب عليك إعادة تعيين OpCache (مثلاً، عن طريق إعادة تشغيل PHP-FPM أو استدعاء
opcache_reset()). - JIT ليس حلاً سحريًا: بالنسبة لتطبيقات CRUD النموذجية، يوفر OpCache وحده معظم المكاسب.
- راقب الذاكرة: يضيف مخزن JIT المؤقت وذاكرة OpCache إلى بصمة PHP. تأكد من أن خادمك يحتوي على ذاكرة وصول عشوائي كافية.
- استخدم التحميل المسبق بحذر: الملفات المحملة مسبقًا تكون دائمًا في الذاكرة؛ تجنب تحميل كل شيء مسبقًا.
الأسئلة الشائعة
هل يحسن JIT الأداء لجميع تطبيقات PHP؟
لا. يفيد JIT المهام كثيفة الاستخدام لوحدة المعالجة المركزية مثل العمليات الحسابية المعقدة أو معالجة البيانات. بالنسبة لتطبيقات الويب المعتمدة على الإدخال/الإخراج (استعلامات قاعدة البيانات، استدعاءات API)، تكون المكاسب ضئيلة. غالبًا ما يوفر OpCache وحده أكبر تسريع.
كيف أعرف أن OpCache يعمل؟
تحقق من phpinfo() لحالة OpCache، أو استدعِ opcache_get_status() في برنامج نصي. ابحث عن opcache_enabled => true وعدد hits مرتفع نسبيًا إلى misses.
هل يمكنني استخدام JIT مع PHP 7؟
لا. تم تقديم JIT في PHP 8.0. يدعم PHP 7 فقط OpCache. إذا كنت تستخدم PHP 7، ركز على ضبط OpCache وفكر في الترقية إلى PHP 8 للحصول على JIT وتحسينات الأداء الأخرى.
هل أنت مستعد لتحليل أداء خادمك؟ تحقق من محلل سجلات Nginx الخاص بنا للحصول على رؤى من سجلات الوصول الخاصة بك وتحديد الاختناقات.