21

我正在开发一个 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 具有读/写/执行权限?

4

8 回答 8

27

您可以通过在 core.php 中的配置中添加掩码来解决此问题

Cache::config('default', array(
    'engine' => 'File',
    'mask' => 0666,
));
于 2012-04-23T19:51:08.033 回答
15

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

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

这是否意味着您cake以 root 身份拨打电话?或者您是否有任何调用 Cake shell 脚本的根 cron 作业?

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

于 2012-03-16T10:17:56.570 回答
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 脚本。这也允许您排除“其他”用户的读/写权限。

于 2013-09-09T17:43:49.287 回答
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?

于 2015-10-24T14:02:13.150 回答
0

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

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

于 2012-05-06T17:10:11.263 回答
0

用这个 ..

cd cakephp/app/tmp/cache/persistent 

sudo chmod 666 myapp*

cd ..

cd models

sudo chmod 666 myapp*
于 2013-08-28T08:21:59.517 回答
0

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

于 2016-02-21T04:57:25.393 回答
0

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

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

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

另一方面,当前用户帐户可用于命名子目录。检查 如何检查用户 php 以什么身份运行?

于 2017-06-22T07:07:19.110 回答