随机,有时,当我加载页面时,它会显示此错误:
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。这里发生了什么??
随机,有时,当我加载页面时,它会显示此错误:
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。这里发生了什么??
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获得实际删除文件的特权的地方。这有点令人费解,但您唯一需要担心的是“列表文件夹”。
似乎保存会话文件的目录设置为您的 php.ini 中不存在的目录。所以要么创建它抱怨的目录,要么为session.save_path
php config 指定另一个目录。
您可以在 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'
));