随机地,当我加载页面时,它会显示此错误:
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。 这是怎么回事?
答案 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'
));