注意(8):CakePHP 2.2的session_start()

时间:2012-10-29 14:30:18

标签: cakephp cakephp-2.0 cakephp-2.1 cakephp-2.2

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

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。 这是怎么回事?

3 个答案:

答案 0 :(得分: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

你有一个gc_probability / gc_divisor的机会,sess_< PHPSESSID>如果save_path中的文件早于gc_maxlifetime。

,则会删除这些文件

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

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

如果你很好奇IUSR能够创建那些sess_< PHPSESSID>文件,因为“Users”被授予遍历文件夹权限和创建文件权限(到目前为止,它从不进行列表操作)。 IUSR似乎是经过身份验证的用户或来自测试执行的用户组的未确认成员here。还有一个特殊的“CREATOR OWNER”权限集,为所有者提供他们创建的文件的完全权限。这是IUSR获得实际删除文件的权限的地方。这有点令人费解,但你唯一需要担心的是“列表文件夹”。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以在Config / core.php中更改Cakephp中的会话save_path。 检查该文件中的以下评论。

* 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'
    ));