Настройка хранилища PHP в каталоге /var/lib/php
Общие сведения о директории /var/lib/php
В операционной системе Linux каталог /var/lib/php традиционно используется PHP для хранения данных, связанных с работой интерпретатора. Сюда помещаются файлы сессий, кеш оперативного кода (OPcache), временные файлы загрузок и другие служебные данные. Правильная настройка путей этой директории критична для стабильности и безопасности веб-приложений.
Основной подход: настройка пути для хранения сессий
Как задать централизованное хранилище сессий в /var/lib/php/sessions?
Стандартное решение - указать в php.ini параметр session.save_path и обеспечить корректные права доступа. Это позволяет PHP-FPM или mod_php сохранять сессионные файлы в одном месте, упрощая управление и очистку.
- Открыть конфигурационный файл PHP (обычно /etc/php/*/php.ini или /etc/php/*/fpm/php.ini).
- Найти строку session.save_path и изменить её значение:
session.save_path = "/var/lib/php/sessions" - Убедиться, что каталог существует и имеет нужные права. Обычно владелец - веб-сервер (www-data, nobody и т.п.) и права 733:
sudo mkdir -p /var/lib/php/sessions sudo chown -R www-data:www-data /var/lib/php/sessions sudo chmod -R 733 /var/lib/php/sessions - Перезапустить PHP-FPM (или веб-сервер) для применения изменений.
sudo systemctl restart php*-fpm
Типичная ошибка: при запуске сессии возникает предупреждение "session_start(): open(/var/lib/php/sessions/sess_..., O_RDWR) failed: Permission denied". Причина - неверные права или владелец каталога. Решение: перепроверить права (должны быть 733) и владельца (должен совпадать с пользователем, от которого работает PHP-FPM).
Цель такого подхода - единое хранилище, упрощающее сбор статистики, очистку устаревших сессий через cron и разграничение доступа.
Вариант: как разместить кеш OPcache в /var/lib/php?
Для ускорения работы PHP можно включить файловый кеш OPcache, указав каталог внутри /var/lib/php.
opcache.file_cache = "/var/lib/php/opcache"
opcache.file_cache_only = 0
Каталог /var/lib/php/opcache необходимо создать и выдать те же права, что и для сессий (владелец веб-сервера, права 733). После настройки OPcache будет сохранять скомпилированные скрипты на диск, что особенно полезно при использовании общих файловых систем (NFS) или для снижения нагрузки на память. Недостаток - увеличение дискового пространства и необходимость периодической очистки.
Возможная проблема: при большом количестве файлов каталог OPcache может занимать гигабайты. Рекомендуется настроить автоматическую очистку через opcache.file_cache_consistency_checks или внешний скрипт.
Вариант: как использовать /var/lib/php для временных файлов загрузки?
Параметр upload_tmp_dir задаёт каталог для временного хранения загружаемых файлов. Его можно перенаправить в /var/lib/php:
upload_tmp_dir = "/var/lib/php/upload"
Такой подход удобен, когда нужно централизованно управлять временными данными. Однако следует помнить о безопасности: каталог не должен быть доступен напрямую из веба. Права обычно устанавливаются 755 с владельцем www-data.
Ошибка: если каталог не существует или недоступен для записи, PHP выдаст предупреждение "File upload error - unable to create temporary file". Решение - проверить существование и права каталога.
Вариант: как задать общий временный каталог через sys_temp_dir?
PHP 8.1+ поддерживает директиву sys_temp_dir, которая определяет путь к временной папке для функций вроде tmpfile(). Если планируется использовать /var/lib/php как единую точку для всех временных данных, укажем:
sys_temp_dir = "/var/lib/php/tmp"
Этот вариант уместен в контейнерных или сильно изолированных средах, где нужно гарантировать, что временные файлы не пересекаются с другими процессами. Требуется создать каталог и назначить соответствующие права.
Заключение
Директория /var/lib/php - гибкий инструмент для централизованного управления сессиями, кешем и временными данными PHP. Выбор конкретного варианта зависит от архитектуры проекта: для типового хостинга достаточно настроить только сессии, для высоконагруженных систем стоит задействовать OPcache и системный временный каталог. Главное - следить за правами доступа и своевременно очищать устаревшие файлы.
Расширенные примеры использования
Пример 1. Скрипт для проверки и автоматической настройки прав на /var/lib/php/sessions
Создадим shell-скрипт, который проверяет существование каталога, владельца и права, а при необходимости исправляет их.
#!/bin/bash
# set_php_sessions.sh
SESS_DIR="/var/lib/php/sessions"
PHP_USER="www-data"
if [ ! -d "$SESS_DIR" ]; then
sudo mkdir -p "$SESS_DIR"
echo "Каталог $SESS_DIR создан"
fi
CURRENT_OWNER=$(stat -c "%U:%G" "$SESS_DIR")
if [ "$CURRENT_OWNER" != "$PHP_USER:$PHP_USER" ]; then
sudo chown -R "$PHP_USER:$PHP_USER" "$SESS_DIR"
echo "Владелец изменён на $PHP_USER"
fi
CURRENT_PERMS=$(stat -c "%a" "$SESS_DIR")
if [ "$CURRENT_PERMS" != "733" ]; then
sudo chmod 733 "$SESS_DIR"
echo "Права установлены на 733"
fi
echo "Настройка завершена"
Результат выполнения:
$ ./set_php_sessions.sh Каталог /var/lib/php/sessions создан Владелец изменён на www-data Права установлены на 733 Настройка завершена
Пример 2. Настройка нескольких пулов PHP-FPM с изолированными путями сессий
Если на сервере работают разные сайты, можно задать для каждого пула собственный каталог сессий внутри /var/lib/php.
Создадим для пула site1 конфигурацию в /etc/php/*/fpm/pool.d/site1.conf:
[site1]
user = site1
…
php_admin_value[session.save_path] = "/var/lib/php/sessions_site1"
Аналогично для site2:
php_admin_value[session.save_path] = "/var/lib/php/sessions_site2"
После перезапуска каждый пул будет использовать свой подкаталог. Права на каждый подкаталог должны быть выставлены под соответствующего пользователя пула.
Результат: сессии разных сайтов не смешиваются, повышается безопасность.
Пример 3. Очистка устаревших сессий через systemd-tmpfiles
Вместо ручного cron можно воспользоваться механизмом systemd-tmpfiles для автоматического удаления файлов сессий старше определённого времени.
Создадим файл /etc/tmpfiles.d/php-sessions.conf:
# Тип Путь Права Владелец Время очистки (в секундах)
d /var/lib/php/sessions 0733 www-data www-data 3d
Параметр 3d означает удаление файлов, изменённых более 3 дней назад. Для применения правила:
sudo systemd-tmpfiles --create /etc/tmpfiles.d/php-sessions.conf
sudo systemd-tmpfiles --clean /etc/tmpfiles.d/php-sessions.conf
Проверим, что файлы очищаются:
$ ls /var/lib/php/sessions/ | wc -l 15 # Через некоторое время после запуска clean: $ ls /var/lib/php/sessions/ | wc -l 8
Этот подход удобен для современных дистрибутивов с systemd.
Пример 4. Перенос кеша OPcache в /var/lib/php с проверкой через PHP-скрипт
Напишем простой PHP-скрипт, который выводит текущее расположение OPcache file_cache и его размер.
<?php
$opcacheConfig = opcache_get_configuration();
$fileCache = $opcacheConfig['directives']['opcache.file_cache'] ?? 'не задан';
echo "File cache path: $fileCache\n";
if (is_dir($fileCache)) {
$size = 0;
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($fileCache));
foreach ($files as $file) {
if ($file->isFile()) $size += $file->getSize();
}
echo "Total size: " . round($size / 1024 / 1024, 2) . " MB\n";
}
Результат в CLI:
$ php check_opcache.php File cache path: /var/lib/php/opcache Total size: 23.45 MB
Скрипт помогает контролировать заполнение диска кешем.