artisan. Neste guia, você vai apontar um novo aplicativo Laravel para o ClickHouse Managed Postgres, criar uma tabela tasks com uma migração e servir as linhas dela a partir de uma rota. Todas as conexões usam TLS com verificação completa de certificados.
Pré-requisitos
- PHP 8.3 ou superior, conforme exigido pelo Laravel 13, com a extensão
pdo_pgsql. Executephp -me verifique sepdo_pgsqlaparece na lista. - Composer
- Uma conta do ClickHouse Cloud
psql, para criar o banco de dados. Você também pode executar a instruçãoCREATE DATABASEno SQL Console.
Criar um serviço ClickHouse Managed Postgres
No console do ClickHouse Cloud, clique em New service e selecione Postgres. A instância fica pronta em poucos minutos. Para um passo a passo, consulte o guia de início rápido.Obtenha os detalhes de conexão
Clique em Connect na barra lateral esquerda do seu serviço. O modal exibe o nome de usuário, a senha, o servidor e a porta, além de uma chave Directly / via PgBouncer. Uma aplicação PHP não mantém um pool de conexões entre requisições. Por padrão, cada requisição abre uma nova conexão com o Postgres e a encerra ao final da requisição. Neste guia, a aplicação se conecta pelo PgBouncer incluído no serviço, na porta6432, para que essas conexões de curta duração compartilhem um pequeno conjunto de backends do Postgres. As migrações se conectam diretamente ao Postgres na porta 5432, pois executam DDL e podem manter transações longas.
Selecione via PgBouncer para ver os detalhes da conexão com pooling. A porta muda para 6432, e as strings de conexão passam a incluir sslmode=verify-full.
No mesmo modal, clique em Download CA certificate. Você também pode baixá-lo em Settings → CA Certificate. O certificado é exclusivo da sua instância, o que permite ao driver usá-lo para verificar se está se comunicando com o seu servidor.
Configure o projeto
Crie um projeto Laravel:ca-certificate.pem.
Crie um banco de dados para o app. Substitua <PASSWORD> e o host pelos valores do modal Connect:
Configure a conexão
Por padrão, o Laravel usa SQLite. Abra o arquivo.env e substitua a linha DB_CONNECTION=sqlite e as linhas DB_ comentadas logo abaixo dela por:
.env
ca-certificate.pem. O libpq resolve caminhos relativos com base no diretório de trabalho do processo PHP, que varia conforme a forma como o PHP executa sua aplicação. Se a sua senha contiver espaços ou #, coloque-a entre aspas duplas. Mantenha o .env fora do controle de versão.
A conexão pgsql padrão em config/database.php lê DB_SSLMODE, mas não o caminho do certificado da CA. Abra config/database.php e adicione as entradas sslrootcert e options à conexão pgsql:
config/database.php
sslmode e sslrootcert ao DSN do PDO, e a extensão pdo_pgsql os repassa à libpq, que verifica a cadeia de certificados e o hostname.
PDO::ATTR_EMULATE_PREPARES faz com que o PDO envie cada consulta com os valores já vinculados, em vez de criar um prepared statement no lado do servidor. Ative essa opção ao se conectar pelo PgBouncer. Quando o pdo_pgsql é compilado com a libpq 16 ou anterior, como no Debian 12, o PHP libera cada prepared statement com uma instrução SQL DEALLOCATE. Como o PgBouncer renomeia os prepared statements no servidor, o DEALLOCATE falha. Dentro de uma transação, isso aborta a transação, e a consulta seguinte falha com current transaction is aborted. Com a libpq 17 ou posterior, as configurações padrão também funcionam. Execute php -i | grep libpq para ver a sua versão.
Verifique a conexão:
Sem a linha
sslrootcert, o verify-full falha com root certificate file ".../.postgresql/root.crt" does not exist, porque o libpq recorre ao seu local padrão de CA. Com a CA errada, a conexão falha com SSL error: certificate verify failed.Crie um model e uma migração
Gere um model Eloquent e uma migração para uma tabelatasks:
database/migrations/ (o nome do arquivo termina em _create_tasks_table.php) e adicione as colunas title e done ao método up:
database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php
app/Models/Task.php para que as colunas possam ser atribuídas em massa e done seja retornado como booleano:
app/Models/Task.php
.env, então basta alterar a porta:
tasks, esse comando cria as tabelas users, sessions, cache e jobs que uma nova aplicação Laravel usa por padrão. O Laravel registra as migrações já aplicadas na tabela migrations e, nas execuções seguintes, executa apenas as novas.
Consultar o banco de dados
Adicione algumas linhas usando o Eloquent noartisan tinker:
routes/web.php uma rota que retorne todas as tarefas em JSON:
routes/web.php
O Laravel aplica as opções de conexão
search_path, timezone e isolation_level por meio de instruções SET em nível de sessão ao se conectar, e essas configurações não são preservadas entre transações quando se usa o PgBouncer. Mantenha essas opções com os valores padrão ou, se precisar delas, conecte-se diretamente pela porta 5432. Recursos em nível de sessão, como LISTEN e advisory locks de sessão, também não funcionam através do PgBouncer. Consulte o FAQ.Executar e verificar
Inicie o servidor de desenvolvimento:http://localhost:3104/tasks no navegador. A resposta será semelhante a esta:
guide_laravel e depois public e clique na tabela tasks. O schema public também lista as tabelas padrão do Laravel, como users, sessions e migrations:
Próximos passos
- Conexão: strings de conexão, PgBouncer e TLS
- Configurações: parâmetros do Postgres e do PgBouncer, como
max_connections - Réplicas de leitura: direcione leituras para uma réplica com as conexões de leitura e escrita do Laravel
- Segurança: listas de acesso por IP e rede privada