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, глобально или специально для вашего приложения во время выполнения (подробности здесь).
Я обнаружил, что самый простой способ справиться с этой проблемой - изменить путь, используемый для сохранения временной информации, на один по моему выбору, а затем установить соответствующие разрешения безопасности.
Чтобы изменить путь, используемый для хранения временных файлов:
- Отредактируйте
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 должен немедленно начать использовать новое расположение папки для сессионных и временных данных.
Просто дайте Полные Права Пользователю "IUSR" в Каталоге "C:\Windows\Temp". Может быть, достаточно просто перечислить и удалить каталоги... но в непроизводительной системе это не должно быть проблемой.