3

随机,有时,当我加载页面时,它会显示此错误:

Notice (8): session_start(): ps_files_cleanup_dir: opendir(C:\Windows\TEMP) failed: No such file or directory (2) [CORE\Cake\Model\Datasource\CakeSession.php, line 615]

我使用的是 CakePHP 2.2。这里发生了什么??

4

3 回答 3

7

PHP 中有一个会话垃圾收集器,它有可能在访问 PHP 站点时执行。这是在 php.ini 中定义的:

session.gc_probability
session.gc_divisor
session.gc_maxlifetime
session.save_path

http://www.php.net/manual/en/session.configuration.php

如果位于 save_path 中的 sess_<PHPSESSID> 文件早于 gc_maxlifetime,则您有 gc_probability/gc_divisor 机会删除它们。

默认情况下 session.save_path 在 Windows 服务器上设置为 C:\Windows\Temp。我怀疑这几乎总是存在的。

您需要为执行 PHP 脚本的任何帐户(如果我们正在谈论 IIS,则默认为 IUSR)提供高级安全下的“列表文件夹”权限。PHP 使用此权限列出 C:\Windows\Temp(或您配置的任何位置)中的文件,以确定它需要解析的 sess_<PHPSESSID> 的实际名称。然后它将遍历这些文件中的每一个,如果修改日期早于 maxlifetime 它将删除该文件。它具有默认情况下所需的所有权限,但列表文件夹除外。奇怪的是,IIS_IUSRS(我相信一个用于应用程序池的组)被授予了这个权限,而不是 IUSR。

如果您好奇,IUSR 能够创建这些 sess_<PHPSESSID> 文件,因为“用户”被授予遍历文件夹权限和创建文件权限(到目前为止,它从未执行列表操作)。从这里执行的测试来看,IUSR 似乎是 Authenticated Users 或 Users 组的不言而喻的成员。还有一个特殊的“CREATOR OWNER”权限集,赋予所有者对他们创建的文件的完全权限。这是IUSR获得实际删除文件的特​​权的地方。这有点令人费解,但您唯一需要担心的是“列表文件夹”。

于 2013-03-05T20:02:09.567 回答
1

似乎保存会话文件的目录设置为您的 php.ini 中不存在的目录。所以要么创建它抱怨的目录,要么为session.save_pathphp config 指定另一个目录。

于 2012-10-29T14:52:53.013 回答
1

您可以在 Config/core.php 中更改 cackphp 中的会话保存路径。

检查该文件中的以下评论。

* The built in defaults are:
 *
 * - 'php' - Uses settings defined in your php.ini.
 * - 'cake' - Saves session files in CakePHP's /tmp directory.
 * - 'database' - Uses CakePHP's database sessions.
 * - 'cache' - Use the Cache class to save sessions.
 *
 * To define a custom session handler, save it at /app/Model/Datasource/Session/<name>.php.
 * Make sure the class implements `CakeSessionHandlerInterface` and set Session.handler to <name>
 *
 * To use database sessions, run the app/Config/Schema/sessions.php schema using
 * the cake shell command: cake schema create Sessions
 *
 */
    Configure::write('Session', array(
        'defaults' => 'cake'
    ));
于 2014-06-19T15:05:03.953 回答