artisan. En esta guía, configurará una nueva aplicación de Laravel para conectarse a ClickHouse Managed Postgres, creará una tabla tasks mediante una migración y devolverá sus filas desde una ruta. Todas las conexiones usan TLS con verificación completa de certificados.
Requisitos previos
- PHP 8.3 o posterior, tal como exige Laravel 13, con la extensión
pdo_pgsql. Ejecutephp -my compruebe quepdo_pgsqlaparece en la lista. - Composer
- Una cuenta de ClickHouse Cloud
psql, para crear la base de datos. También puede ejecutar la sentenciaCREATE DATABASEen la consola SQL.
Crear un servicio de ClickHouse Managed Postgres
En la consola de ClickHouse Cloud, haga clic en New service y seleccione Postgres. La instancia estará lista en unos minutos. Consulte la guía de inicio rápido para ver el proceso paso a paso.Obtén los detalles de conexión
Haz clic en Conectar en la barra lateral izquierda de tu servicio. El cuadro modal muestra tu nombre de usuario, contraseña, servidor y puerto, e incluye un toggle Directly / via PgBouncer. Una aplicación PHP no mantiene un grupo de conexiones entre solicitudes. De forma predeterminada, cada solicitud abre una nueva conexión a Postgres y la cierra al finalizar. En esta guía, la aplicación se conecta a través del PgBouncer integrado en el puerto6432, de modo que esas conexiones de corta duración compartan un pequeño conjunto de procesos backend de Postgres. Las migraciones se conectan directamente a Postgres en el puerto 5432, ya que ejecutan DDL y pueden mantener transacciones largas.
Selecciona via PgBouncer para ver los detalles de la conexión agrupada. El puerto cambia a 6432 y las cadenas de conexión incluyen sslmode=verify-full.
En el mismo cuadro modal, haz clic en Download CA certificate. También puedes descargarlo desde Settings → CA Certificate. El certificado es exclusivo de tu instancia, lo que permite al controlador verificar que se está comunicando con tu servidor.
Configurar el proyecto
Cree un proyecto de Laravel:ca-certificate.pem.
Cree una base de datos para la aplicación. Sustituya <PASSWORD> y el host por los valores del modal Conectar:
Configurar la conexión
Laravel usa SQLite de forma predeterminada. Abra.env y sustituya la línea DB_CONNECTION=sqlite y las líneas DB_ comentadas que aparecen debajo por lo siguiente:
.env
ca-certificate.pem. libpq resuelve las rutas relativas respecto al directorio de trabajo del proceso PHP, que depende de cómo PHP ejecute su aplicación. Si su contraseña contiene espacios o #, escríbala entre comillas dobles. No incluya .env en el control de versiones.
La conexión pgsql predeterminada de config/database.php lee DB_SSLMODE, pero no la ruta del certificado de la CA. Abra config/database.php y agregue las entradas sslrootcert y options a la conexión pgsql:
config/database.php
sslmode y sslrootcert al DSN de PDO, y la extensión pdo_pgsql los pasa a libpq, que verifica la cadena de certificados y el nombre del host.
PDO::ATTR_EMULATE_PREPARES hace que PDO envíe cada consulta con sus valores ya vinculados, en lugar de crear una sentencia preparada del lado del servidor. Actívelo cuando se conecte a través de PgBouncer. Si pdo_pgsql está compilado con libpq 16 o anterior, como ocurre en Debian 12, PHP libera cada sentencia preparada mediante una sentencia SQL DEALLOCATE. PgBouncer cambia el nombre de las sentencias preparadas en el servidor, por lo que DEALLOCATE falla. Si esto ocurre dentro de una transacción, la transacción se aborta y la siguiente consulta falla con current transaction is aborted. Con libpq 17 o posterior, la configuración predeterminada también funciona. Ejecute php -i | grep libpq para comprobar su versión.
Compruebe la conexión:
Sin la línea
sslrootcert, verify-full falla con el error root certificate file ".../.postgresql/root.crt" does not exist, porque libpq recurre a la ubicación predeterminada de su CA. Si la CA es incorrecta, la conexión falla con SSL error: certificate verify failed.Crear un modelo y una migración
Genere un modelo de Eloquent y una migración para una tablatasks:
database/migrations/ (su nombre termina en _create_tasks_table.php) y añada las columnas title y done al método up:
database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php
app/Models/Task.php para que las columnas admitan asignación masiva y done se devuelva como boolean:
app/Models/Task.php
.env, así que solo necesita cambiar el puerto:
tasks, esto crea las tablas users, sessions, cache y jobs que una aplicación nueva de Laravel utiliza de forma predeterminada. Laravel registra las migraciones aplicadas en la tabla migrations y, en ejecuciones posteriores, solo aplica las nuevas.
Consultar la base de datos
Agregue algunas filas con Eloquent desdeartisan tinker:
routes/web.php una ruta que devuelva todas las tareas en formato JSON:
routes/web.php
Laravel aplica las opciones de conexión
search_path, timezone e isolation_level mediante sentencias SET a nivel de sesión al conectarse, y estas no se conservan entre transacciones cuando se pasa por PgBouncer. Deje estas opciones con sus valores predeterminados o, si las necesita, conéctese directamente al puerto 5432. Las funcionalidades a nivel de sesión, como LISTEN y los bloqueos consultivos de sesión, tampoco funcionan a través de PgBouncer. Consulte las preguntas frecuentes.Ejecutar y verificar
Inicie el servidor de desarrollo:http://localhost:3104/tasks en tu navegador. La respuesta será similar a la siguiente:
guide_laravel y, a continuación, public, y haga clic en la tabla tasks. El esquema public también incluye las tablas predeterminadas de Laravel, como users, sessions y migrations:
Próximos pasos
- Conexión: cadenas de conexión, PgBouncer y TLS
- Configuración: parámetros de Postgres y PgBouncer, como
max_connections - Réplicas de lectura: dirija las lecturas a una réplica mediante las conexiones de lectura y escritura de Laravel
- Seguridad: listas de acceso por IP y redes privadas