首页 PHP 正文
708

关于real path cache的问题

  • yiqingpeng
  • 2019-08-27
  • 0
  •  
有一种代码发布的方案是采用变更软链接的方式进行版本切换,比如 release1, release2, ...存放的是不同版本的代码,webroot是一个软链接,指向某一个releaseN. web服务器的Document Root配置为webroot. 通过切换webroot的指向就可以达到版本更新的目的。
因为有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以模块方式运行)

参考:https://engineering.facile.it/blog/eng/realpath-cache-is-it-all-php-opcache-s-fault/


正在加载评论...