#Что происходит и когда инструкция применима
Если SQLite работает при запуске PHP из терминала, но отказывает через PHP-FPM, обычно различаются версия PHP, набор расширений, пользователь пула, рабочий каталог, open_basedir и права на базу/каталог.
Характерный признак: Команда php script.php успешно читает SQLite, а запрос через Nginx/Apache отдаёт 500, PDOException или сообщает, что драйвер SQLite не найден.
#Как отличить возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Разные сборки PHPCLI и FPM могут использовать разные php.ini и наборы модулей | CLI показывает pdo_sqlite, FPM — нет | Проверить именно FPM |
| Пользователь пула не имеет доступаРабочий процесс FPM выполняется не от учётной записи разработчика | Permission denied только в веб-запросе | Проверить точечные права |
| Относительный путь или open_basedirТекущий каталог PHP-FPM отличается от терминала, либо путь запрещён | Открывается пустая база или error 14 | Указать абсолютный путь |
#Пошаговая диагностика и исправление
- 1. Сохраните сообщение об ошибке из журнала FPMПовторите один тестовый запрос и запишите точную строку PDOException/SQLSTATE и время. На управляемом сервере смотрите журнал выбранного сайта и пула через панель управления, а не произвольный общий лог.
- 2. Проверяйте CLI только как исходную точкуОткройте терминал Linux и запустите реальный бинарный файл PHP, используемый в консоли. Вывод php -m показывает набор модулей только CLI, не веб-обработчика.
- Linux CLI; ожидается PDO и pdo_sqlite/sqlite3 для этой конкретной сборкиLinux · Терминал (Bash)КомандаLinux CLI; ожидается PDO и pdo_sqlite/sqlite3 для этой конкретной сборки. Отсутствие grep в Windows не означает отсутствия модулей.
php -v && php -m | grep -Ei 'pdo|sqlite'
- 3. Узнайте версию PHP и расширения именно FPMВ панели управления сайтом посмотрите режим обработчика и версию PHP. Администратор может сделать временный закрытый диагностический сценарий с PHP_VERSION, PHP_SAPI и extension_loaded("pdo_sqlite") — не публикуйте полный phpinfo.
- 4. Определите пользователя нужного пулаПосмотрите user/group в конфигурации выбранного FPM-пула или в панели хостинга. При нескольких сайтах и версиях PHP эти пользователи могут быть разными. Не считайте www-data универсальным ответом.
- 5. Замените относительный путь абсолютнымВ конфигурации PHP используйте путь, который реально существует на сервере, например /var/www/site/data/app.db; для приложений в контейнерах путь внутри контейнера может отличаться от пути на хосте. Не допускайте создания нового файла пустой базы в случайном каталоге.
- 6. Проверьте права файла и каталогаНа Linux администратор проверяет цепочку каталогов. Если есть WAL, процессу обычно нужна возможность создавать файлы в каталоге базы; задавайте права только нужной учётной записи.
- Чтение; path примерLinux · Терминал (Bash)КомандаЧтение; path пример. Вывод позволяет найти каталог, где отсутствует проход/доступ.
namei -l /var/www/site/data/app.db
- 7. Проверьте ограничения PHP и защитные журналыСверьте open_basedir, настройки chroot, контейнерные монтирования, ACL/SELinux/AppArmor с реальным расположением базы. Ошибка расширения обычно требует установки именно для нужной FPM-сборки, а не только для CLI.
- 8. Протестируйте один запрос через HTTP и уберите диагностикуВ закрытом тестовом окружении выполните SELECT к существующей таблице через настоящий веб-запрос. Ожидается тот же результат, что из CLI. Сразу удалите временный диагностический сценарий, проверьте журнал, сохраните рабочие права и настройки.
#Как проверить исправление
Через веб-запрос FPM PDO_SQLITE загружается, путь ведёт к нужной базе, чтение и контролируемая запись на тесте работают; временный диагностический файл удалён.
#Если исправление не помогло
Если только FPM даёт ошибку, проверьте конфигурацию конкретного пула, разрешения каталога, блокировку open_basedir, SELinux и логи веб-сервера; не меняйте глобальные настройки вслепую.