Настройка хранилища PHP в каталоге /var/lib/php

Раздел: Конфигурация PHP -> Работа с библиотеками и путями

Общие сведения о директории /var/lib/php

В операционной системе Linux каталог /var/lib/php традиционно используется PHP для хранения данных, связанных с работой интерпретатора. Сюда помещаются файлы сессий, кеш оперативного кода (OPcache), временные файлы загрузок и другие служебные данные. Правильная настройка путей этой директории критична для стабильности и безопасности веб-приложений.

Основной подход: настройка пути для хранения сессий

Как задать централизованное хранилище сессий в /var/lib/php/sessions?

Стандартное решение - указать в php.ini параметр session.save_path и обеспечить корректные права доступа. Это позволяет PHP-FPM или mod_php сохранять сессионные файлы в одном месте, упрощая управление и очистку.

  1. Открыть конфигурационный файл PHP (обычно /etc/php/*/php.ini или /etc/php/*/fpm/php.ini).
  2. Найти строку session.save_path и изменить её значение:
    session.save_path = "/var/lib/php/sessions"
  3. Убедиться, что каталог существует и имеет нужные права. Обычно владелец - веб-сервер (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
  4. Перезапустить 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

Скрипт помогает контролировать заполнение диска кешем.

Директория var/lib/php - comments

En
Var lib php (php)