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". Может быть, достаточно просто перечислить и удалить каталоги... но в непроизводительной системе это не должно быть проблемой.