OPcache stale code 🐘 PHP

PHP still runs old code after deploy (OPcache not reset)

OPcache keeps serving cached bytecode, so changes uploaded to the server don’t take effect.

Seen on: PHP

Meaning

With opcache.validate_timestamps=0 (common in production) PHP never checks files again until FPM restarts or the cache is reset. Symlink-swap deployments also confuse realpath caches.

Common causes

  • validate_timestamps disabled
  • Deploy without reloading PHP-FPM
  • Symlink-based deploys with realpath cache

⚡ Quick fix

  1. Reload PHP-FPM after each deploy (systemctl reload php8.2-fpm)
  2. Call opcache_reset() via a protected endpoint
  3. Use $realpath_root in Nginx for symlink deploys

Detailed fix by platform

Nginx

  1. fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;

How to diagnose

  1. Setting — opcache.validate_timestamps value
  2. Deploy — Is FPM reloaded?

🧠 Still stuck? Analyze your error

Paste the full message, response headers or stack trace — we'll detect the platform and point to the most likely cause.