Windows 上的 PHP - ps_files_cleanup_dir 错误

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 无法执行垃圾收集,我该如何解决?

Dea*_*ean 5

根据 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 中的会话保存设置、全局或专门为您的应用程序在运行时设置(详情请点击此处)。