PHP на Windows - ошибка ps_files_cleanup_dir

Я иногда получаю следующую ошибку при загрузке страницы 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 все-еще существует.

Я использую PHP 5.6.5 на IIS в Windows 8.1.

Почему PHP не может выполнить сборку мусора, и как я могу это исправить?

2 ответа

Решение

Временные файлы сеанса создаются в этом каталоге в соответствии со свойством session.save_path в php.ini. Без разрешения на удаление файлов в этом каталоге PHP не может удалить эти файлы как часть своего обычного процесса обработки мусора сеанса, и поэтому они накапливаются, когда они больше не нужны / вы будете иногда видеть эту ошибку всякий раз, когда выполняется сборка мусора.

Пользователь Application Pool, который фактически запускает исполняемый файл 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, глобально или специально для вашего приложения во время выполнения (подробности здесь).

Я обнаружил, что самый простой способ справиться с этой проблемой - изменить путь, используемый для сохранения временной информации, на один по моему выбору, а затем установить соответствующие разрешения безопасности.

Чтобы изменить путь, используемый для хранения временных файлов:

  1. Отредактируйте php.ini для вашей установки (моя находилась в C:\Program Files\PHP\v7.4).
  2. Расположен session.save_path настройка.
  3. Измените путь с C:\Windows\Tempв папку по вашему выбору. Специально для этого создал папку.

Чтобы изменить права доступа к указанной выше папке:

  1. Щелкните правой кнопкой мыши папку в проводнике Windows и выберите Properties.
  2. Выбрать Security таб.
  3. Нажмите Advanced открыть Advanced Security Settings выскакивать.
  4. Нажмите Change Permissions.
  5. Нажмите Add... чтобы добавить нового пользователя.
  6. Печатать IIS_IUSRS в качестве имени объекта и щелкните OK.
  7. На Permissions Entry всплывающее окно, отметьте настройки для Full control под Allow столбец.
  8. Нажмите OK вернуться к основному Permissions список.
  9. Обязательно установите флажок внизу страницы, на котором указано Replace all child object permissions with inheritable permissions from this object.
  10. Нажмите OK и подтвердите все остальные всплывающие окна и окна.

PHP должен немедленно начать использовать новое расположение папки для сессионных и временных данных.

Просто дайте Полные Права Пользователю "IUSR" в Каталоге "C:\Windows\Temp". Может быть, достаточно просто перечислить и удалить каталоги... но в непроизводительной системе это не должно быть проблемой.

Другие вопросы по тегам