Embedded Variables,
$realpath_root
: an absolute pathname corresponding to the root or alias directive’s value for the current request, with all symbolic links resolved to real paths
A solução de usar $realpath_root
em vez de $document_root
é copiada e colada em todos os sites e fóruns de Q / A; na verdade, é difícil evitar encontrá-lo. No entanto, eu só o vi bem explicado uma vez por Rasmus Lerdorf . Vale a pena compartilhar como ele descreve porque funciona e quando deve ser usado.
So, when you deploy via something like Capistrano which does a symlink swap on the document root, you want all new requests to get the new files, but you don't want to screw over requests that are currently executing as the deploy is happening. What you really need to create a robust deploy environment is to have your web server be in charge of this. The web server is the piece of the stack that understands when a new request is starting. The opcode cache is too deep in the stack to know or care about that.
With nginx this is quite simple. Just add this to your config:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root;
This tells nginx to realpath resolve the docroot symlink meaning that as far as your PHP application knows, the target of the symlink if the real document_root. Now, once a request starts, nginx will resolve the symlink as it stands at that point and for the duration of the request it will use the same docroot directory, even if the symlink switch happening mid-request. This entirely eliminates the symptoms described here and it is the correct approach. This isn't something that can be solved at the opcache level.
Kanishk Dudeja teve problemas com isso e adicionou um aviso útil: certifique-se de que essas alterações estejam realmente na configuração final, ou seja, após include fastcgi_params;
, que de outra forma as substituirá.