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

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 не может выполнять сборку мусора и как это исправить?

Временные файлы сеанса создаются в этом каталоге в соответствии со свойством session.save_path в php.ini. Без разрешений на удаление файлов в этом каталоге 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

Обновить: Как отмечает Гремио, вы должны переместить файлы сеанса в определенный каталог, чтобы вы не предоставляли этому пользователю доступ на запись (который может быть использован) во все остальное, что 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». Может быть, достаточно просто перечисления и удаления каталогов ... но в непродуктивной системе это не должно быть проблемой.