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

**Code:** `OPcache stale code` · **Category:** PHP · **Seen on:** PHP

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

## 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?

---
Source: [WhatIsMyError](https://whatismyerror.com/errors/php/opcache-stale-code-after-deploy)
