SplFileInfo :: openFile(/ app / tmp / cache / persistent / cake_core_cake_console _):无法打开流:/lib/.../FileEngine.php第293行中的权限被拒绝

时间:2012-03-16 07:32:20

标签: cakephp cakephp-2.0 cakephp-2.1

我正在开发CakePHP 2项目。它最初从2.0.x开始,然后最近迁移到2.1.0。在整个开发过程中,我一直收到以下错误消息。

它不可预测地弹出页面顶部。它可能是我只是在查看不同的页面,甚至在我向数据库添加记录后(但记录正确保存)。

Warning:
SplFileInfo::openFile(/var/www/cake_prj/app/tmp/cache/persistent/cake_core_cake_console_): 
failed to open stream: 
Permission denied in 
     /var/www/cake_prj/lib/Cake/Cache/Engine/FileEngine.php on line 293

我以递归方式将tmp文件夹的所有者和组设置为apache,并仍然收到该消息。另外,我然后递归地设置读取,写入和执行所有权限(chmod 777)。错误消息仍然会弹出。

即使在更改了所有者,组和权限之后,相关文件仍然存在:

cake_prj/app/tmp/cache/persistent/cake_core_cake_console_

将其所有者和组设置回root,并将其权限设置回默认值。

可能导致此问题的原因是什么?有没有办法确保每次生成此文件时,它始终都是apache:具有读/写/执行权限的apache?

8 个答案:

答案 0 :(得分:25)

您可以通过在core.php

中为配置添加掩码来解决此问题
Cache::config('default', array(
    'engine' => 'File',
    'mask' => 0666,
));

答案 1 :(得分:15)

那里有一个错误报告http://cakephp.lighthouseapp.com/projects/42648/tickets/2172,但它被认为不是一个错误。

我个人注意到的是,当您在控制台中使用cake脚本时,可能会修改某些文件所有者(例如,创建bake)。然后,修改后的文件属于您在控制台中使用的用户。

这是否意味着您在成为root时调用cake?或者你有任何调用Cake shell脚本的root cron作业吗?

Personaly我现在习惯在使用chmod脚本后将整个tmp文件夹内容cake回到apache用户,这似乎可以防止出现警告。

答案 2 :(得分:7)

我没有设置对tmp / cache目录中每个人的读/写访问权限,而是执行了此操作:

chgrp -R www-data app/tmp
chmod -R g+rw app/tmp 
find app/tmp -type d -exec chmod g+s {} \;

将目录组设置为Apache用户然后设置setgid位将允许您确保在该目录中创建的文件获得正确的组权限,而不管用户运行shell脚本的是什么。这也允许您排除对“其他”用户的读/写权限。

答案 3 :(得分:2)

我认为已经解释了问题的原因,因为cron在root用户下运行并且tmp中创建的文件不能被Web用户访问。其他解决方案对我不起作用,我不想将tmp权限设置为777,我最终为网络用户设置了一个cron作业,特别是debian

crontab -u www-data -e

取自这个答案How to specify in crontab by what user to run script?

答案 4 :(得分:0)

如果您在CakePHP2中遇到SplFileInfo错误并且您完全确定您的文件/目录权限已正确设置,那么另一件需要检查的是您的PHP版本。 Cake2需要PHP 5.2.8或更高版本,虽然如果您使用的是错误的版本,通常会在默认页面上收到警报,但如果您在一台服务器上开发了应用程序然后将其移动到另一台服务器上,则不会收到警报

我在PHP5.3服务器上开发Cake2应用程序然后将其移动到PHP 5.1服务器后遇到此错误。升级到5.2.17(高于5.2.8)解决了这个问题。

答案 5 :(得分:0)

使用此..

cd cakephp/app/tmp/cache/persistent 

sudo chmod 666 myapp*

cd ..

cd models

sudo chmod 666 myapp*

答案 6 :(得分:0)

您需要使网络服务器可以写入app / tmp目录。找出您的网络服务器运行的用户(在我的情况下_www)并将app / tmp目录的所有权更改为该用户:$ chown -R _www app/tmp

答案 7 :(得分:0)

另一种解决方案。由于多个用户共享相同的文件,因此发生了权限冲突。因此,如果我们将缓存目录拆分为多个子目录,则不会发生冲突,也不会更改所需目录和文件的默认权限。

如下所示,每个子缓存目录由php api处理程序的类型定义:

define('CACHE', TMP . 'cache' . DS . php_sapi_name() . DS);
  • 浏览网站时,活跃用户是apache。而且子 目录是 cache / apache2handler
  • 运行批处理时,活动用户是root用户或登录用户。 子目录是 cache / cli

另一方面,当前用户帐户可用于命名子目录。检查 How to check what user php is running as?