我在Zend Framework中设置了一个元数据缓存,因为执行了很多DESCRIBE
查询,它影响了性能。
$frontendOptions = array ('automatic_serialization' => true);
$backendOptions = array ('cache_dir' => CACHE_PATH . '/db-tables-metadata');
$cache = Zend_Cache::factory(
'Core',
'File',
$frontendOptions,
$backendOptions
);
Zend_Db_Table::setDefaultMetadataCache($cache);
我确实可以看到创建的缓存文件,并且该网站运行良好。
但是,当我启动单元测试或执行数据库查询的同一应用程序的脚本时,我最终会出现错误,因为 Zend 无法读取缓存文件。
这是因为在网站中,缓存文件是由www用户创建的,当我运行phpunit或脚本时,它试图与我的用户一起读取它们,但失败了。
你看到有什么解决方案吗?我有一些快速修复的想法,但我正在寻找一个良好/稳定的解决方案。如果可能的话,我宁愿避免www
运行phpunit或脚本(出于实际原因)。
尝试sudo
命令。 像这样的东西$sudo -u www php -f run-tests.php
编辑
或
$backendOptions = array ('cache_dir' => CACHE_PATH . '/db-tables-metadata', 'cache_file_umask' => 0755, 'cache_file_perm' => 0755);
是否需要在单元测试期间缓存表元数据? 我通常会在开发/测试中禁用该缓存。
您可以尝试将测试用户添加到www
组 ( usermod -a -G www testuser
)。
缓存文件可能具有标准的644
权限,这意味着您的用户仍然无法修改文件,但是如果您在测试期间将缓存目录的权限设置为777
,那么您应该能够将新文件写入该目录。
如果您使用 CGI/FastCGI 运行 PHP,则可以让 PHP 以用户身份运行,而不是以通用www
用户身份运行。 或者,如果您使用的是Apache模块,mod_suphp
也将允许您以用户身份运行PHP。
对不起,它没有太多帮助,但希望能给你更多的想法。
我遇到了类似的问题 后来我发现,由于我正在运行其他几个应用程序服务器缓存发生冲突意味着两个应用程序使用相同的缓存,请尝试为所有类型的命名缓存对象
而且如果你愿意的话还可以配置App.php文件来创建不同的缓存文件进行单元测试,这是共享主机中常见的问题。