Я иногда получаю следующую ошибку при загрузке страницы 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', или вы можете использовать группу App Pool, которая будет похожа на IUSRS.
Лучшая практика заключается в создании нового пула приложений для каждого сайта. Когда вы это сделаете, IIS создаст пользователя Windows, которому вы сможете предоставить права на изменения. Вы можете написать сценарий этого или сделать это из командной строки, используя следующую команду:
icacls c:\windows\TEMP\ /inheritance:e /grant "IIS APPPOOL\your-user:(OI)(CI)M" /t /c /Q
Update: Как отмечает Gremio, вы должны переместить файлы сеанса в определенную директорию, чтобы не дать этому пользователю доступ на запись (которая может быть использована) к тому, что еще хранится Windows в директории TEMP. Вы можете изменить настройки сохранения сеансов в php.ini, глобально или специально для вашего приложения во время выполнения (подробности здесь ).
Просто дайте полные разрешения пользователю «IUSR» в каталоге «C: \ Windows \ Temp». Может быть, достаточно просто перечислить и удалить каталоги ... но в непродуктивной системе это не должно быть проблемой.
Я обнаружил, что самый простой способ справиться с этой проблемой — изменить путь, используемый для сохранения временной информации, на один из выбранных мной, а затем установить соответствующие разрешения безопасности.
Чтобы изменить путь, используемый для хранения временных файлов:
php.ini
для вашей установки (мой был расположен в C:\Program Files\PHP\v7.4
). session.save_path
.C:\Windows\Temp
на папку по вашему выбору. Специально для этого создал папку. Чтобы изменить разрешения для указанной выше папки:
Свойства
. Безопасность
. Дополнительно
, чтобы открыть всплывающее окно Дополнительные параметры безопасности
. Изменить разрешения
. Добавить...
, чтобы добавить нового пользователя. IIS_IUSRS
в качестве имени объекта и нажмите ОК
. Ввод разрешений
установите флажок Полный доступ
в столбце Разрешить
. ОК
, чтобы вернуться к основному списку Разрешений
. Заменить все разрешения дочернего объекта разрешениями, наследуемыми от этого объекта
. ОК
и подтвердите все другие всплывающие окна и окна. PHP должен немедленно начать использовать новую папку для сеансовых и временных данных.