我是偶尔加载 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
一个月前的sess_
文件C:\Windows\TEMP
仍然存在。
我在 Windows 8.1 上的 IIS 上运行 PHP 5.6.5。
为什么 PHP 无法执行垃圾收集,以及如何修复它?
答案1
根据 php.ini 中的“session.save_path”属性,会话临时文件在此目录中创建。如果没有删除此目录中文件的权限,PHP 无法在其正常会话垃圾处理过程中删除这些文件,因此当它们不再需要时,它们会累积起来/每次执行垃圾收集时您都会偶尔看到此错误。
应用程序池用户(即实际运行 PHP 可执行文件的用户)至少需要修改 C:\Windows\TEMP 上的权限才能执行垃圾收集(默认情况下不授予该权限)。如果您尚未更改此用户的默认权限,则它应该是“DefaultAppPool”,或者您可以使用应用程序池组,它与 IUSRS 类似。
最佳做法是为每个站点创建一个新的应用程序池。执行此操作时,IIS 将创建一个 Windows 用户,然后您可以向其授予修改权限。您可以编写脚本或使用以下命令从命令行执行此操作:
icacls c:\windows\TEMP\ /inheritance:e /grant "IIS APPPOOL\your-user:(OI)(CI)M" /t /c /Q
更新:正如 Gremio 所指出的,您应该将会话文件移动到特定目录,这样您就不会授予此用户对 Windows 存储在 TEMP 目录中的任何其他内容的写访问权限(这可能会被利用)。您可以在 php.ini 中全局或专门为您的应用程序在运行时修改会话保存设置(详细信息这里)。
答案2
我发现解决这个问题最简单的方法是将用于保存临时信息的路径更改为我选择的路径,然后设置适当的安全权限。
要更改用于存储临时文件的路径:
- 编辑
php.ini
您的安装 (我的位于C:\Program Files\PHP\v7.4
)。 - 找到
session.save_path
设置。 - 将路径更改为
C:\Windows\Temp
您选择的文件夹。我专门为此创建了一个文件夹。
要更改上面指定的文件夹的权限:
- 在 Windows 资源管理器中右键单击文件夹并选择
Properties
。 - 选择
Security
选项卡。 - 单击
Advanced
即可打开Advanced Security Settings
弹出窗口。 - 点击
Change Permissions
。 - 单击
Add...
可添加新用户。 - 输入
IIS_IUSRS
对象名称并单击OK
。 - 在弹出窗口中,勾选列下的
Permissions Entry
设置。Full control
Allow
- 单击
OK
即可返回主Permissions
列表。 - 确保选中页面底部的复选框
Replace all child object permissions with inheritable permissions from this object
。 - 单击
OK
并确认所有其他弹出窗口和窗口。
PHP 应该立即开始使用新的文件夹位置来存储会话和临时数据。
答案3
只需授予用户“IUSR”对目录“C:\Windows\Temp”的完全权限即可。也许仅目录列表和删除就足够了……但在非生产系统中,这应该不是问题。