当通过 HTML 表单将文件上传到 PHP 脚本时,上传的文件将保留在 upload_tmp_dir 中,即使请求结束并且 PHP 代码没有明确删除该文件。
预期行为:请求结束时,PHP 会删除文件上传中未使用、未移动或未删除的临时文件。这也是 php.net 针对文件上传描述的行为:“如果文件尚未移走或重命名,则请求结束时将从临时目录中删除该文件。”,请参阅:http://php.net/manual/en/features.file-upload.post-method.php
这是在引擎盖下发生的事情:
文件在 upload_tmp_dir 中创建。PHP 代码不会触碰该文件。请求结束。PHP 尝试删除临时文件,但访问被拒绝。
我们用 procmon 对此进行了分析。您可以看到,php-cgi.exe 进程似乎没有像 move_uploaded_file() 那样模拟删除请求。
解决方法:如果我们在 uploaded_tmp_dir 上为 IIS_IUSRS 组添加 MODIFY 权限,则该文件将在请求结束后按预期被删除。
环境:IIS 7.x 上通过 FCGI 运行的 PHP 5.3/5.4
在 WS2012、WS2008 R2 上复现。
我在 PHP bugtracker 中讨论了这个问题,但他们不相信我:https://bugs.php.net/bug.php?id=68535
我需要一些关于这个主题的支持。有人能重现这个吗?我做错了什么。