artisan. Dans ce guide, vous connectez une nouvelle application Laravel à ClickHouse Managed Postgres, créez une table tasks au moyen d’une migration, puis exposez ses lignes via une route. Toutes les connexions utilisent TLS avec une vérification complète des certificats.
Prérequis
- PHP 8.3 ou une version ultérieure, requis par Laravel 13, avec l’extension
pdo_pgsql. Exécutezphp -met vérifiez quepdo_pgsqlfigure dans la liste. - Composer
- Un compte ClickHouse Cloud
psql, pour créer la base de données. Vous pouvez également exécuter le statementCREATE DATABASEdans la console SQL.
Créer un service ClickHouse Managed Postgres
Dans la console ClickHouse Cloud, cliquez sur New service et sélectionnez Postgres. L’instance est prête en quelques minutes. Pour une présentation pas à pas, consultez le guide de démarrage rapide.Obtenir vos informations de connexion
Cliquez sur Connect dans la barre latérale gauche de votre service. La fenêtre modale affiche votre nom d’utilisateur, votre mot de passe, le serveur et le port, ainsi qu’un sélecteur Directly / via PgBouncer. Une application PHP ne conserve pas de pool de connexions d’une requête à l’autre. Par défaut, chaque requête ouvre une nouvelle connexion Postgres, puis la ferme une fois terminée. Dans ce guide, l’application se connecte via le PgBouncer intégré sur le port6432, afin que ces connexions éphémères se partagent un petit nombre de processus backend Postgres. Les migrations, elles, se connectent directement à Postgres sur le port 5432, car elles exécutent du DDL et peuvent maintenir des transactions longues.
Sélectionnez via PgBouncer pour afficher les informations de connexion mutualisée. Le port passe à 6432 et les chaînes de connexion incluent sslmode=verify-full.
Dans la même fenêtre modale, cliquez sur Download CA certificate. Vous pouvez également le télécharger depuis Settings → CA Certificate. Ce certificat étant propre à votre instance, le driver peut l’utiliser pour vérifier qu’il communique bien avec votre serveur.
Configurer le projet
Créez un projet Laravel :ca-certificate.pem.
Créez une base de données pour l’application. Remplacez <PASSWORD> et l’hôte par les valeurs indiquées dans la fenêtre modale Connect :
Configurer la connexion
Laravel utilise SQLite par défaut. Ouvrez.env et remplacez la ligne DB_CONNECTION=sqlite, ainsi que les lignes DB_ commentées qui la suivent, par :
.env
ca-certificate.pem. libpq résout un chemin relatif par rapport au répertoire de travail du processus PHP, lequel dépend de la manière dont PHP exécute votre application. Si votre mot de passe contient des espaces ou le caractère #, placez-le entre guillemets doubles. Excluez .env du contrôle de version.
La connexion pgsql par défaut définie dans config/database.php lit DB_SSLMODE, mais pas le chemin du certificat de CA. Ouvrez config/database.php et ajoutez les entrées sslrootcert et options à la connexion pgsql :
config/database.php
sslmode et sslrootcert au DSN PDO, et l’extension pdo_pgsql les transmet à libpq, qui vérifie la chaîne de certificats et le nom d’hôte.
PDO::ATTR_EMULATE_PREPARES indique à PDO d’envoyer chaque requête avec ses valeurs déjà liées, au lieu de créer un prepared statement côté serveur. Activez cette option lorsque vous vous connectez via PgBouncer. Lorsque pdo_pgsql est compilé avec libpq 16 ou une version antérieure, par exemple sous Debian 12, PHP libère chaque prepared statement à l’aide d’un statement SQL DEALLOCATE. Comme PgBouncer renomme les prepared statements sur le serveur, le DEALLOCATE échoue. Au sein d’une transaction, cet échec interrompt la transaction, et la requête suivante échoue avec l’erreur current transaction is aborted. Avec libpq 17 ou une version ultérieure, les paramètres par défaut fonctionnent également. Exécutez php -i | grep libpq pour connaître votre version.
Vérifiez la connexion :
Sans la ligne
sslrootcert, verify-full échoue avec l’erreur root certificate file ".../.postgresql/root.crt" does not exist, car libpq utilise alors l’emplacement par défaut de son autorité de certification (CA). Si la CA est incorrecte, la connexion échoue avec l’erreur SSL error: certificate verify failed.Créer un modèle et une migration
Générez un modèle Eloquent et une migration pour une tabletasks :
database/migrations/ (son nom se termine par _create_tasks_table.php) et ajoutez les colonnes title et done dans la méthode up :
database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php
app/Models/Task.php afin que les colonnes puissent être affectées en masse et que done soit renvoyé sous forme de booléen :
app/Models/Task.php
.env : il vous suffit donc de modifier le port :
tasks, cette commande crée les tables users, sessions, cache et jobs qu’une nouvelle application Laravel utilise par défaut. Laravel consigne les migrations déjà appliquées dans la table migrations et, lors des exécutions suivantes, n’exécute que les nouvelles.
Interroger la base de données
Ajoutez quelques lignes avec Eloquent depuisartisan tinker :
routes/web.php une route qui renvoie toutes les tâches au format JSON :
routes/web.php
Laravel applique les options de connexion
search_path, timezone et isolation_level au moyen de statements SET de niveau session lors de la connexion, et celles-ci ne sont pas conservées d’une transaction à l’autre via PgBouncer. Conservez les valeurs par défaut de ces options, ou connectez-vous directement sur le port 5432 si vous en avez besoin. Les fonctionnalités liées à la session, telles que LISTEN et les verrous consultatifs (advisory locks) de session, ne fonctionnent pas non plus via PgBouncer. Consultez la FAQ.Exécuter et vérifier
Démarrez le serveur de développement :http://localhost:3104/tasks dans votre navigateur. Vous devriez obtenir une réponse semblable à celle-ci :
guide_laravel puis public, et cliquez sur la table tasks. Le schéma public contient également les tables Laravel par défaut, comme users, sessions et migrations :
Étapes suivantes
- Connexion : chaînes de connexion, PgBouncer et TLS
- Paramètres : paramètres de Postgres et de PgBouncer, tels que
max_connections - Répliques en lecture : redirigez les lectures vers une réplique à l’aide des connexions en lecture et en écriture de Laravel
- Sécurité : listes d’accès IP et réseau privé