PHP的缓存有很多种,包括输出缓冲(ob系列函数),opcode缓存(APC,eAccelerator,XCache等扩展实现),这些大家已经很熟悉了,接下来介绍一下一个不太被人注意的PHP缓存机制:realpath_cache。

介绍

require,require_once,include,include_once这四个语句(并非函数)大家经常会用到,如果用这类语句去包含文件 (相对路径)的话,那么PHP会去include_path所 指定的路径中去查找相关文件。一个应用中会存在大量的require_once语句调用,如果每次调用都去include_path中查找相应的文件,势 必会对应用的性能产生负面影响。为了避免这种负面效应产生的影响,PHPER们会使用文件的绝对路径来包含所需的文件,这样就减少了查询 include_path的次数。

其实,PHP自5.1.0起,就引入了RealpathCache。RealpathCache可以把PHP所用到文件的realpath进行缓存,以便PHP再使用这些文件的时候不需要再去include_path中查找,加快PHP的执行速度。

配置

realpath cache的配置项有两个,分别为realpath_cache_size和realpath_cache_ttl,可以在php.ini中进行修改:

; Determines the size of the realpath cache to be used by PHP. This value should

; be increased on systems where PHP opens many files to reflect the quantity of

; the file operations performed.

; http://php.net/realpath-cache-size

;realpath_cache_size = 16k

; Duration of time, in seconds for which to cache realpath information for a given

; file or directory. For systems with rarely changing files, consider increasing this

; value.

; http://php.net/realpath-cache-ttl

;realpath_cache_ttl = 120

其中realpath_cache_size指定了realpath cache的大小,默认为16k,如果你觉得这个容量太小,可以适当增加;realpath_cache_ttl指定了缓存的过期时间,默认为120秒, 对于不经常修改的生产环境来说,这个数字可以调整的更大些。

问题

由于realpath会 展开symlink(即软连接),所以如果你使用修改symlink目标这种方式发布应用的新版本的话,realpath cache会导致一些问题的出现:当你修改symlink使其指向一个新的release目录时候,由于realpath cache所缓存内容还没有过期,于是就会出现应用使用的还是旧的release,直到realpath cache所缓存内容过期失效为止(默认120秒),或者重启php-fpm。

看个例子:

基础环境:nginx + fastcgi + php-fpm

应用环境:/var/www/app是一个symlink,并做为document_root,在/var/www下存在version0.1,version0.2两个版本的release。初始情况下/var/www/app指向version0.1

lrwxr-xr-x 1 weizhifeng staff 10 10 22 16:41 app -> version0.1

drwxr-xr-x 3 weizhifeng staff 102 10 22 16:43 version0.1

drwxr-xr-x 3 weizhifeng staff 102 10 22 16:43 version0.2

version0.1,version0.2内部各有一个hello.php

[weizhifeng@Jeremys-Mac www]$ cat version0.1/hello.php

echo 'in version0.1';

?>

[weizhifeng@Jeremys-Mac www]$ cat version0.2/hello.php

echo 'in version0.2';

?>

nginx配置文件片段:

location / {

root /var/www/app; #app为symlink

index index.php index.html index.htm;

}

location ~ \.php$ {

root /var/www/app; #app为symlink

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi_params;

}

此时通过HTTP访问hello.php,得到的内容是’in version0.1′;修改/var/www/app,使其指向version0.2

[weizhifeng@Jeremys-Mac www]$ rm -f app && ln -s version0.2/ app

修改完成之后通过HTTP访问hello.php,得到的内容仍旧是”in version0.1″,可见是realpath cache在作祟了,此时你可以重启php-fpm或者等待120秒钟让realpath cache失效。

你可以使用clearstatcache来清 除realpath cache,但是这个只对当前调用clearstatcache函数的PHP进程有效,而其他的PHP进程还是无效,由于PHP进程池(php-fpm生 成,或者Apache在prefork模式下产生的N个httpd子进程)的存在,这个方法不是很适用。

php realpath 缓存,PHP的Realpath Cache相关推荐

  1. 域名缓存侦测(DNS Cache Snooping)技术

    域名缓存侦测(DNS Cache Snooping)技术 在企业网络中,通常都会配置DNS服务器,为网络内的主机提供域名解析服务.这些DNS不仅解析自己的私有域名,还会用递归方式,请求公网的DNS解析 ...

  2. 开启注解缓存_Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  3. javax.cache_新的Java缓存标准(javax.cache)

    javax.cache 这篇文章探讨了新的Java缓存标准:javax.cache. 它如何适应Java生态系统 该标准由JSR107开发,作者是共同规范负责人. JSR107包含在JSR342开发的 ...

  4. 新的Java缓存标准(javax.cache)

    这篇文章探讨了新的Java缓存标准:javax.cache. 它如何适应Java生态系统 该标准由JSR107开发,作者是共同规范负责人. JSR107包含在JSR342开发的Java EE 7中. ...

  5. PHP常见缓存技术分析(cache)

    在大部份情况下我们的网站都会使用数据库作为站点数据存储的容器.当你执行一个SQL查询时,典型的处理过程 是:连接数据库->准备SQL查询->发送查询到数据库->取得数据库返回结果-& ...

  6. wordrpress静态缓存插件WP Super Cache 使用教程

    WordPress 静态缓存插件众多,孰优孰劣,这里不予评判,只说一说使用率比较高的静态缓存插件WP Super Cache的基本使用方法. 插件安装 进入WordPress后台 → 插件 → 安装插 ...

  7. 最佳 WordPress 静态缓存插件 WP Super Cache 安装和使用(转)

    WP Super Cache 是 WordPress 官方开发人员 Donncha开发,是当前最高效也是最灵活的 WordPress 静态缓存插件.它把整个网页直接生成 HTML 文件,这样 Web ...

  8. WordPress加速缓存插件WP Super cache安装方法及使用技巧

    当Wordpress博客的访问量逐渐升高时,如何加快Wordpress运行效率,减少服务器压力,提高Wordpress的访问速度,就成为了日益紧迫的事情了.话说Wordpress臃肿低效率的毛病在网上 ...

  9. colab清理gpu缓存_Maya2014全面使用手册_GPU 缓存首选项(GPU Cache Preferences)_软件教程_资源库...

    摘要:Maya2014全面使用手册_GPU 缓存首选项(GPU Cache Preferences)_软件教程_资源库 相关视频教程学习推荐: 造型设计<鹫>造型上色完整流程[实名认证] ...

最新文章

  1. php的遍历方法,PHP数组遍历方法总结
  2. html左右飘窗高度不一致,飘窗的最佳尺寸,你可知道?不懂的留着吧!
  3. 50个PHP程序性能优化的方法
  4. js去掉字符串中的所有空格
  5. 操作系统--用户级线程和内核级线程
  6. 【零基础学Java】—笔记本USB接口案例(二十八)
  7. PAT 乙级 1044. 火星数字(20) Java版
  8. 在线HTML实体转字符串工具
  9. 三色交替的下拉列表框
  10. [HZOI 2016]tree—增强版
  11. Linux命令学习笔记之 network NetworkManager
  12. iF.svnadmin安装部署
  13. 一张图看明白金融数据架构
  14. 今天我们聊聊进了字节跳动真的就算上岸吗?附带我的字节跳动4面面经分享给大家!
  15. QGraphicsItem图元拖动绘制(二)
  16. 我要大学答案-大学生都在用的小程序 课后习题答案|实验报告|考研资料|期末真题~
  17. 新版DedeCMS采集发布插件教程工具
  18. 软件测试 查看网页打开时间,网页响应时间101(三)
  19. 关于apk软件的加固加壳和签名打包
  20. 中国气象历史数据china1942_2022降水、温度、气压、风速、风向、云量,逐小时部分为逐三小时

热门文章

  1. ios怎么引入masonry_ios masonry 怎样设置边距自适应
  2. 可编程直流稳压电源如何保养维护?
  3. Win10 + Ubuntu双系统U盘安装,详细过程(带图解)
  4. 【技术实现】java实时同步postgresql变更数据,基于WAL日志
  5. 为什么不能结账_为什么其他结帐行总是移动得更快
  6. 按键精灵免字库本地识别OCR
  7. IT培训讲师的亲身感受
  8. 【离线语音专题①】安信可最新离线语音模组VC系列出厂固件使用教程——SDK开源?
  9. 刷脸支付满足商户无人收单场景需求
  10. 如何驯服事件驱动的微服务