artisan. В этом руководстве вы подключите новое приложение Laravel к ClickHouse Managed Postgres, создадите таблицу tasks с помощью миграции и настроите маршрут, который будет возвращать её строки. Все соединения защищены TLS с полной проверкой сертификата.
Предварительные требования
- PHP 8.3 или новее (этого требует Laravel 13) с расширением
pdo_pgsql. Выполнитеphp -mи убедитесь, чтоpdo_pgsqlесть в списке. - Composer
- Аккаунт ClickHouse Cloud
psqlдля создания базы данных. Также можно выполнить операторCREATE DATABASEв консоли SQL.
Создание сервиса ClickHouse Managed Postgres
В консоли ClickHouse Cloud нажмите New service и выберите Postgres. Инстанс будет готов через несколько минут. Подробное пошаговое описание приведено в руководстве по быстрому старту.Получите сведения о подключении
Нажмите Подключение на левой боковой панели вашего сервиса. В открывшемся модальном окне отображаются имя пользователя, пароль, сервер и порт, а также переключатель Directly / via PgBouncer. PHP-приложение не сохраняет пул соединений между запросами. По умолчанию каждый запрос открывает новое соединение с Postgres и закрывает его по завершении. В этом руководстве приложение подключается через встроенный PgBouncer на порту6432, благодаря чему кратковременные соединения совместно используют небольшой набор backend-соединений Postgres. Миграции подключаются к Postgres напрямую через порт 5432, поскольку они выполняют DDL и могут удерживать длительные транзакции.
Выберите via PgBouncer, чтобы увидеть сведения о подключении через пул. Порт сменится на 6432, а строки подключения будут содержать sslmode=verify-full.
В том же модальном окне нажмите Download CA‑сертификат. Его также можно скачать в разделе Settings → CA‑сертификат. Сертификат уникален для вашего инстанса, поэтому с его помощью драйвер может убедиться, что подключается именно к вашему серверу.
Настройка проекта
Создайте проект Laravel:ca-certificate.pem.
Создайте базу данных для приложения. Замените <PASSWORD> и хост значениями из модального окна Подключение:
Настройка соединения
По умолчанию Laravel использует SQLite. Откройте файл.env и замените строку DB_CONNECTION=sqlite, а также расположенные под ней закомментированные строки DB_, следующим фрагментом:
.env
ca-certificate.pem. libpq разрешает относительные пути от рабочего каталога процесса PHP, а он зависит от того, как PHP запускает ваше приложение. Если пароль содержит пробелы или #, заключите его в двойные кавычки. Не добавляйте .env в систему контроля версий.
Стандартное соединение pgsql в config/database.php считывает DB_SSLMODE, но не путь к CA‑сертификату. Откройте config/database.php и добавьте в соединение pgsql записи sslrootcert и options:
config/database.php
sslmode и sslrootcert в DSN PDO, а расширение pdo_pgsql передаёт их в libpq, которая проверяет цепочку сертификатов и имя хоста.
PDO::ATTR_EMULATE_PREPARES заставляет PDO отправлять каждый запрос с уже подставленными значениями, а не создавать подготовленный оператор на стороне сервера. Включите этот параметр, если подключаетесь через PgBouncer. Если pdo_pgsql собран с libpq версии 16 или более ранней (например, в Debian 12), PHP освобождает каждый подготовленный оператор с помощью SQL-оператора DEALLOCATE. PgBouncer переименовывает подготовленные операторы на сервере, поэтому DEALLOCATE завершается ошибкой. Внутри транзакции это приводит к её прерыванию, и следующий запрос завершается ошибкой current transaction is aborted. С libpq версии 17 и новее работают и настройки по умолчанию. Чтобы узнать свою версию, выполните php -i | grep libpq.
Проверьте соединение:
Без строки
sslrootcert режим verify-full завершается ошибкой root certificate file ".../.postgresql/root.crt" does not exist, поскольку libpq в этом случае ищет CA‑сертификат в расположении по умолчанию. Если указан неверный CA, соединение завершается ошибкой SSL error: certificate verify failed.Создание модели и миграции
Создайте модель Eloquent и миграцию для таблицыtasks:
database/migrations/ (имя её файла оканчивается на _create_tasks_table.php) и добавьте в метод up столбцы title и done:
database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php
app/Models/Task.php, чтобы столбцы можно было заполнять массово, а done возвращался как булево значение:
app/Models/Task.php
.env, поэтому достаточно изменить только порт:
tasks, эта команда создаёт таблицы users, sessions, cache и jobs, которые новое приложение Laravel использует по умолчанию. Laravel сохраняет сведения о применённых миграциях в таблице migrations и при последующих запусках выполняет только новые.
Запросы к базе данных
Добавьте несколько строк с помощью Eloquent вartisan tinker:
routes/web.php маршрут, который возвращает все задачи в формате JSON:
routes/web.php
При подключении Laravel задаёт параметры соединения
search_path, timezone и isolation_level с помощью операторов SET на уровне сеанса, а при работе через PgBouncer эти настройки не сохраняются между транзакциями. Оставьте для этих параметров значения по умолчанию или, если они вам нужны, подключайтесь напрямую через порт 5432. Возможности уровня сеанса, такие как LISTEN и сеансовые рекомендательные блокировки (advisory locks), через PgBouncer также не работают. Подробнее см. в FAQ.Запуск и проверка
Запустите сервер для разработки:http://localhost:3104/tasks в браузере. Ответ будет выглядеть примерно так:
guide_laravel, затем public и выберите таблицу tasks. В схеме public также отображаются стандартные таблицы Laravel, например users, sessions и migrations:
Дальнейшие шаги
- Подключение: строки подключения, PgBouncer и TLS
- Настройки: параметры Postgres и PgBouncer, например
max_connections - Реплики для чтения: перенаправление запросов на чтение в реплику с помощью соединений для чтения и записи в Laravel
- Безопасность: списки IP Access List и частное сетевое подключение