因为有realpath_cache的原因,就有可能导致软链接切换之后,实际运行的还是原版本的代码。
比如代码更新前:webroot -> release1, 通过命令 `rm -f webroot && ln -s release2 $_ `更新到release2之后,此时webroot->release2, 在没有重启php-fpm的情况下,运行的代码很可能还是release1中的代码。
发生这种情况需要具备以下三个条件
1. php.ini中两个配置 realpath_cache_size和realpath_cache_ttl的值都大于0
2. web服务器未对real path进行解析。
3. php进程以非cgi模式运行,cgi模式下php进程在一个请求完成之后会马上销毁,新来的请求重新创建新的进程,而realpath_cache是进程级的缓存,生命周期跟随php进程。
所以要解决realpath_cache的问题也有三种方案:
1. 关闭php.ini相关的配置,realpath_cache对于大项目而言,缓存了大量的文件真实路径,对性能有很大的帮助,所以不建议关闭它。
2. Apache有相关模块可以将document root解析为真实路径。Nginx则更简单一些,它本身就有相关内置变量指向真实的路径:
# default configuration
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $document_root;
# configuration with real path resolution
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
3. 每次切换完软链接之后重启php-fpm(php以fast-cgi模式运行)或者apache服务器(php以模块方式运行)