Назад | Перейти на главную страницу

Загруженные временные файлы PHP не удаляются в IIS из-за отказа в доступе для IUSR

При загрузке файла с помощью 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 ().

Обходной путь: если мы добавим права MODIFY для группы IIS_IUSRS в uploaded_tmp_dir, файл будет удален после завершения запроса, как ожидалось.

Среда: PHP 5.3 / 5.4 через FCGI на IIS 7.x

Воспроизводится на WS2012, WS2008 R2.

Я обсуждаю это в PHP bugtracker, но мне не верят: https://bugs.php.net/bug.php?id=68535

Мне нужна поддержка в этой теме. Может ли кто-нибудь воспроизвести это? Что делаю не так.