`
zhengdl126
  • 浏览: 2539307 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

PHP的Realpath Cache

 
阅读更多

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
<?php
echo 'in version0.1';
?>

[weizhifeng@Jeremys-Mac www]$ cat version0.2/hello.php
<?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子进程)的存在,这个方法不是很适用。

参考:

http://php.net/manual/en/ini.core.php#ini.sect.performance

http://sixohthree.com/1517/php-and-the-realpath-cache

分享到:
评论

相关推荐

    PHP性能优化大全.docx

    同时,适当调整`realpath_cache_size`和`realpath_cache_ttl`的值,增加缓存大小并延长缓存有效期,可以显著提高文件包含的效率。 总结来说,PHP性能优化涉及系统调用优化、Apache配置优化、日志管理和函数使用等多...

    PHP结构优化大全(整理)

    中的`realpath_cache_size`和`realpath_cache_ttl`设置,确保缓存足够大且过期时间合理。 #### 七、Conclusion 通过对上述几个方面的深入理解和实践,可以显著提高PHP应用的整体性能。优化不仅仅局限于代码层面,还...

    php.ini-development

    user_ini.cache_ttl = 300 ;;;;;;;;;;;;;;;;;;;; ; Language Options ; ;;;;;;;;;;;;;;;;;;;; ; Enable the PHP scripting language engine under Apache. ; http://php.net/engine engine = On ; This directive...

    php中文配置文件

    - `realpath_cache_size`:真实路径缓存的大小,影响文件路径解析性能。 5. **变量和函数配置** - `register_globals`:是否自动将URL参数注册为全局变量,为了安全,此选项一般设为`Off`。 - `allow_url_fopen`...

    PHP文件缓存内容保存格式实例分析

    $this-&gt;_cache_path = realpath(dirname(__FILE__) . "/") . "/cache/"; } } public function get($id) { if (!file_exists($this-&gt;_cache_path . $id)) { return FALSE; } $data = @file_get_contents($...

    PHP实现批量清空删除指定文件夹所有内容的方法

    realpath(dirname(__FILE__) . '/../data/cache_data'), realpath(dirname(__FILE__) . '/../data/cache_file'), realpath(dirname(__FILE__) . '/../data/cache_view') ); // 遍历并清空每个文件夹 foreach ($...

    PHP clearstatcache()函数详解

    - `$clear_realpath_cache` (可选):布尔值,如果设置为 `true`,则同时清除实际路径缓存。默认情况下,此参数为 `false`。 - `$filename` (可选):字符串,指定特定文件的路径。如果提供此参数,只清除该文件的缓存...

    兼容ie6浏览器的php下载文件代码分享

    $filepath = str_replace('\\', '/', realpath($filename)); // 获取真实路径,处理路径中的反斜杠 $filesize = filesize($filepath); // 获取文件大小 $filename = substr(strrchr('/' . $filepath, '/'), 1); // ...

    php 下载保存文件保存到本地的两种实现方法

    2. **文件名处理**:通过`realpath()`函数获取文件的绝对路径。如果提供了`$fileurl`参数,则使用这个参数作为文件名。接着,通过`date()`函数结合时间格式,生成新的文件名,并确保具有唯一性。 3. **设置Content-...

    ZendFramework中文文档

    RealPath 14.2.9. StringToLower 14.2.10. StringToUpper 14.2.11. StringTrim 14.2.12. StripTags 14.3. 过滤器链 14.4. 编写过滤器 14.5. Zend_Filter_Input 14.5.1. Declaring Filter and Validator ...

Global site tag (gtag.js) - Google Analytics