CakePHP FileEngine :: clear需要很多CPU时间

时间:2014-03-31 20:12:54

标签: php cakephp

上周我将我的CentOS服务器迁移到另一台机器上 VDS服务器硬件非常相似。 我尽力在新机器中复制服务器行为 CakePHP 2.4.4,PHP 5.4.26。我将PHP作为apache模块提供服务。 XCache 3.1.0。

(但似乎我在某些时候会得到太多的CPU时间 例如,一切都工作10分钟但是2分钟我的CPU变为100%,然后变为%5,并且在4-5分钟后我再次获得CPU 100%)

似乎在我的CakePHP应用程序中

FileEngine::clear()

太多时间了。如何诊断/调试FileEngine::clear为什么花费太多时间?

您可以从图像中检查代码运行时间:
图1:http://s29.postimg.org/qfj26aq8n/shot1.jpg
图2:http://s9.postimg.org/uzwh1a5i7/shot2.jpg

另请注意,在我的error.log文件中,我收到了以下错误:

Warning: Warning (2): is_dir(): open_basedir restriction in effect. File(/) is not within the allowed path(s): (/var/www/vhosts/example.com/:/tmp/:/usr/share/fonts/) in [/var/www/vhosts/example.com/httpdocs/lib/Cake/Cache/Engine/FileEngine.php, line 265]
Trace:
is_dir - [internal], line ??
FileEngine::_clearDirectory() - CORE/Cake/Cache/Engine/FileEngine.php, line 265
FileEngine::clear() - CORE/Cake/Cache/Engine/FileEngine.php, line 247
FileEngine::gc() - CORE/Cake/Cache/Engine/FileEngine.php, line 100
Cache::_buildEngine() - CORE/Cake/Cache/Cache.php, line 184
Cache::config() - CORE/Cake/Cache/Cache.php, line 151
include - APP/Config/bootstrap.php, line 101
Configure::bootstrap() - CORE/Cake/Core/Configure.php, line 92
include - CORE/Cake/bootstrap.php, line 175
[main] - APP/webroot/index.php, line 93

请注意,在Apache配置中,open_basedir (p)设置如下:

{WEBSPACEROOT}{/}{:}{TMP}{/}:/usr/share/fonts/

编辑:
我在FileEngine::clearFileEngine::_clearDirectory中记录了时间戳。但是没有奇怪的时刻。最慢的通话有0.3秒。平均为0.01秒。但是当我检查FileEngine::clear()通话时间时,我会看到高峰时间为90-95秒。

1 个答案:

答案 0 :(得分:0)

几天后我找到了解决方案。问题是这样的:

/app/tmp/cache/文件夹中,我有一些像这样的文件夹:

/app/tmp/cache/mydata1/
/app/tmp/cache/mydata2/
/app/tmp/cache/mydata3/

每个文件夹都有10k-15k文件。 因此,在每分钟/小时运行垃圾收集并运行FileEngine::clear()并检查这些文件夹。检查这些文件夹会占用太多CPU时间。

在app / Config / bootstrap.php中,存在如下的缓存设置:

Cache::config('default', array('engine' => 'File'));

通过将概率更改为零来禁用垃圾收集:

Cache::config('default', array('engine' => 'File', 'probability' => 0));
  

概率命中缓存gc清理的可能性。设置为0   将禁用cache :: gc自动被调用。

http://api.cakephp.org/2.4/class-Cache.html#_config

例如,我有另外一个缓存配置:

Cache::config('30secs', array(
    'engine' => "File",
    'duration' => '+30 seconds',
    'path' => CACHE,
    'prefix' => 'cake_element_30secs_'
));

然后CakePHP将每隔30秒检查一次临时文件夹。所以它可以删除不必要的缓存文件。您还可以通过将概率更改为零来禁用垃圾收集。

我的建议是,如果/app/tmp/cache/文件夹中有太多文件,您应该将数据移动到另一个文件夹,这样就不会花费你的CPU了。