Moo*_*man 6 iis php session garbage-collecting
加载 PHP 页面时,我偶尔会收到以下错误:
PHP Notice: session_start(): ps_files_cleanup_dir: opendir(C:\Windows\TEMP) failed: No error (0) in C:\server\default.php on line 299
Run Code Online (Sandbox Code Playgroud)
一个月前的sess_
文件C:\Windows\TEMP
仍然存在。
我在 Windows 8.1 上的 IIS 上运行 PHP 5.6.5。
为什么 PHP 无法执行垃圾收集,我该如何解决?
根据 php.ini 中的“session.save_path”属性在此目录中创建会话临时文件。如果没有删除此目录中文件的权限,PHP 无法将这些文件作为其正常会话垃圾处理过程的一部分删除,因此它们会在不再需要时累积/在执行垃圾收集时偶尔会看到此错误。
Application Pool 用户是实际运行 PHP 可执行文件的用户,至少需要修改 C:\Windows\TEMP 上的权限才能执行垃圾收集(默认情况下不授予此权限)。如果您没有更改默认用户,那么它应该是“DefaultAppPool”,或者您可以使用类似于 IUSRS 的 App Pool 组。
最佳做法是为每个站点创建一个新的应用程序池。执行此操作时,IIS 将创建一个 Windows 用户,然后您可以向其授予修改权限。您可以编写此脚本或使用以下命令从命令行执行此操作:
icacls c:\windows\TEMP\ /inheritance:e /grant "IIS APPPOOL\your-user:(OI)(CI)M" /t /c /Q
Run Code Online (Sandbox Code Playgroud)
更新:正如 Gremio 所指出的,您应该将会话文件移动到特定目录,这样您就不会授予此用户(可能被利用)对 TEMP 目录中 Windows 存储的任何其他内容的写访问权限。您可以修改 php.ini 中的会话保存设置、全局或专门为您的应用程序在运行时设置(详情请点击此处)。