Skip to main content
Version: 8.x

Avoid PHP-FPM Reloading

Deployer symlinks current to latest release dir.

current -> releases/3/
releases/
1/
2/
3/

The problem

PHP Opcodes get cached. And if SCRIPT_FILENAME contains current symlink, on new deploy nothing updates. Usually, a solution is simple to reload php-fpm after deploy, but such reload can lead to dropped or failed requests. The correct fix is to configure your server set SCRIPT_FILENAME to a resolved path. You can check your server configuration by printing SCRIPT_FILENAME.

echo $_SERVER['SCRIPT_FILENAME'];

If it prints something like /home/deployer/example.com/current/index.php with current in the path, your server configured incorrectly.

Fix for Nginx

Nginx has special variable $realpath_root, use it to set up SCRIPT_FILENAME:

location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}

Fix for Caddy

tip

If you're already using servers provisioned by Deployer, you don't need to fix anything, as everything is already configured properly.

Use resolve_root_symlink:

php_fastcgi * unix//run/php/php-fpm.sock {
resolve_root_symlink
}

Fix for Apache

Enable revalidate_path in php.ini:

opcache.revalidate_path=1