بلا opcache تقرأ PHP كلَّ ملفّ وتترجمه مع كلّ طلب — العملُ نفسه آلافَ المرّات في الدقيقة، لملفّاتٍ لم تتغيّر. وopcache يُبقي الصورة المترجَمة في الذاكرة. وهو في الغالب أكبرُ تحسينٍ منفردٍ متاح، وهو إعدادٌ واحد.

opcache.enable=1
opcache.memory_consumption=192
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=2

تأكّد أنّه يعمل فعلًا

php -i | grep -E 'opcache.enable|opcache.memory'
# or, in a page you can reach:
print_r(opcache_get_status()['opcache_statistics']);
  • opcache_hit_rate دون 95% — memory_consumption أصغر من اللازم، فهو يطرد ملفّاتٍ سيحتاجها ثانية.
  • num_cached_keys قرب max_accelerated_files — ارفع حدَّ الملفّات؛ فإطارُ العمل الكبير ملفّاته أكثر ممّا يسمح به الافتراض.

وما لا يفعله

يخزّن الشفرة المترجَمة لا النتائج. فالاستعلامُ البطيء بطيءٌ تمامًا وopcache يعمل. وإن كانت صفحتك بطيئةً بسبب ما تسأله قاعدةَ البيانات فهذا لا يغيّر شيئًا — وتلك أشيعُ خيبة.

الإعداد الذي يُخفي نشرةً

opcache.validate_timestamps=0 أسرع، ومعناه أنّ PHP لا تفحص أبدًا أتغيّر ملفٌّ أم لا. فتخرج نشرتك ويظلّ الموقع يقدّم الشفرة القديمة، بلا خطأ في أيّ مكان. فإن ضبطته فيجب أن تُفرّغ نشرتُك المخزن.
# after deploying, with validate_timestamps=0
cachetool opcache:reset
# or reload the pool
systemctl reload php8.3-fpm
على استضافة EGPHP يكون opcache مفعَّلًا ومضبوطًا للحوض. وهذه الصفحة لخادمٍ افتراضيّ تديره أنت.