【问题标题】:CakePHP: Permission denied (13)CakePHP:权限被拒绝 (13)
【发布时间】:2014-03-24 06:04:39
【问题描述】:

我想知道为什么 cakephp 会出现这个错误。我将所有文件都更改为 777 权限但不起作用:(

警告:session_start() [function.session-start: open(/tmp/sess_c885be0c60e567d6c6c7571c61601f71, O_RDWR) failed: Permission denied (13) [CORE/Cake/Model/Datasource/CakeSession.php line 618]

session_start - [internal], line 
CakeSession::_startSession() - CORE/Cake/Model/Datasource/CakeSession.php, line 618
CakeSession::start() - CORE/Cake/Model/Datasource/CakeSession.php, line 190
CakeSession::check() - CORE/Cake/Model/Datasource/CakeSession.php, line 216
SessionHelper::flash() - CORE/Cake/View/Helper/SessionHelper.php, line 123
include - APP/View/Layouts/default.ctp, line 53
View::_evaluate() - CORE/Cake/View/View.php, line 945
View::_render() - CORE/Cake/View/View.php, line 907
View::renderLayout() - CORE/Cake/View/View.php, line 535
View::render() - CORE/Cake/View/View.php, line 479
Controller::render() - CORE/Cake/Controller/Controller.php, line 948
ScriptsController::javascript() - APP/Controller/ScriptsController.php, line 31
ReflectionMethod::invokeArgs() - [internal], line ??
Controller::invokeAction() - CORE/Cake/Controller/Controller.php, line 486
Dispatcher::_invoke() - CORE/Cake/Routing/Dispatcher.php, line 187
Dispatcher::dispatch() - CORE/Cake/Routing/Dispatcher.php, line 162
[main] - APP/webroot/index.php, line 111

【问题讨论】:

    标签: php cakephp permissions file-permissions


    【解决方案1】:

    首先,将所有内容更改为 777 是一个非常糟糕的主意。这意味着让服务器上的每个用户都可以完全访问所有内容,这意味着任何有权访问您的网络服务器的人都可以编辑甚至删除您的文件。将其与现实生活中的问题进行比较,就好像您的车门上的锁有问题,而您只是决定不再锁门。它是在避免问题而不是解决问题,如果有一天你的收音机不见了,你不应该感到惊讶。

    话虽如此,您的问题的核心是您的 Cake 应用程序(或者实际上是它正在调用的内部 PHP 函数 session_start)没有写入文件 /tmp/sess_c885be0c60e567d6c6c7571c61601f71 的权限,该文件是 PHP 会话文件.默认情况下,大多数 PHP 安装尝试将其会话写入服务器上的 /tmp 文件夹。在这种情况下,这似乎不起作用。

    以下是一些可能的解决方案:

    1. 如果应用程序在不是由您自己管理的服务器上运行(例如,如果您有付费托管计划并且只能通过 FTP 访问您自己的域文件夹),请联系管理服务器的人员/方并要求他们使 /tmp 目录可写。他们应该能够正确解决这个问题。

    2. 在您的 app/Config/core.php 中,设置存储 Cake 会话的不同方式。有几个可用选项,所有选项都在文件本身中进行了解释(右here)。使用cake、cache 或database 选项应确保您的会话始终可以正确访问。

    3. 如果您自己管理 Web 服务器,您可以为 PHP 会话提供具有适当访问权限的自己的文件夹。这一步包括几个任务:

      • 为会话创建一个文件夹,公共路径为/var/lib/php/session
      • 让您的网络服务器用户(通常是apache 或www-data)是该文件夹的所有者(例如chown apache.apache /var/lib/php/session)
      • 为文件夹设置适当的 chmod 级别,因为只有网络服务器的用户/组需要完全访问权限,所以 640 的 chmod 就可以了 (chmod 640 /var/lib/php/session)
      • 将您的 php.ini 文件中的 session.save_path 编辑到此文件夹,这样您就会有一行显示:session.save_path = "/var/lib/php/session"
      • 重新启动您的网络服务器,一切顺利!

    【讨论】:

    • @MarwanSalim 当然可以,但话说回来,你还没有真正阅读我的回答,解释为什么你不应该这样做。
    • 是的,我读过,但我的意思是仅对于这个文件夹,'/var/lib/php/session' 应该可以作为替代解决方案。我可能错了,请建议,因为我尝试按照您的步骤操作但无法工作,可能是因为错误的网络服务器用户。 ;-)
    • @MarwanSalim 通过设置 chmod 777 您几乎可以完全禁用该文件夹的安全性。至少,您应该 chmod 到 770,禁用不是您的网络服务器的“其他”用户/组的读取、写入和执行权限。如今在大多数系统上,网络用户是www-data。您的网络服务器配置应该在某处设置。
    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2018-07-19
    • 2013-08-15
    • 1970-01-01
    • 2017-04-20
    • 2011-06-11
    相关资源
    最近更新 更多