SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
PHP e PostgreSQL
Um é pouco, dois é bom, três é demais
Fabrízio de Royes Mello @fabriziomello
Fabrízio de Royes Mello
• Empreendedor
• Colaborador PostgreSQL
Não sou um programador PHP… já tentei um dia mas...
Contextualizando
$ git clone 
> git@github.com:fabriziomello/phpconference.git
$ cd phpconference
$ vagrant up
$ vagrant ssh
$ cd /mnt/bootstrap/php
<?php
// Connection string
$DSN =
"host=localhost
port=5432
user=phpconference
dbname=phpconference
password=phpconference";
?>
Async Connection
Aguarde conexão executando sua lógica
<?php
// Try to connect to database phpconference
$dbconn = pg_connect($DSN, PGSQL_CONNECT_ASYNC);
// Wait for connection ...
while( pg_connect_poll($dbconn) <> PGSQL_POLLING_OK ) {
echo "Waiting for connection ...n";
usleep(100000);
}
echo "Connected ...n";
?>
Async Query
Execute sua lógica enquanto aguarda SQL
<?php
$dbconn = pg_connect($DSN);
$query = "WITH rnd AS (SELECT random()*5 AS n) SELECT pg_sleep(n), n,
'Some string' FROM rnd";
$secs = 0;
if( !pg_connection_busy($dbconn) ) {
$sent = pg_send_query($dbconn, $query);
while( pg_connection_busy($dbconn) ) {
$secs++;
echo "Waiting $secs seconds ...n";
sleep(1);
}
$result = pg_get_result($dbconn);
var_dump(pg_fetch_row($result));
?>
LISTEN / NOTIFY
Notificações Assíncronas com PostgreSQL
<?php
$dbconn = pg_connect($DSN);
pg_query($conn, 'LISTEN chat_room_1;');
while(1) {
$notify = pg_get_notify($conn);
if (!$notify) {
echo "No messagesn";
} else {
print_r($notify);
}
sleep(1);
}
?>
Bulk Load
Inserir dados em blocos no banco de dados
<?php
$dbconn = pg_connect($DSN);
pg_query($dbconn, "CREATE TABLE bar (a INT4, b CHAR(16), d
NUMERIC)");
pg_query($dbconn, "COPY bar FROM stdin");
pg_put_line($dbconn, "3thello worldt4.5n");
pg_put_line($dbconn, "4tgoodbye worldt7.11n");
pg_put_line($dbconn, ".n");
pg_end_copy($dbconn);
?>
Dica “Unlogged Tables”
• tipo especial de tabela que não gera Logs de Transação
• tornam operações de escrita muito performática
• não são “crash-safe”
• não replicam pois não geram Logs de Transação
• se combinado com COPY em alguns cenários pode ser de
10x a 100x mais (ou mais) rápido que INSERT em tabela
regular
Cursores
Lendo blocos de registros do banco
<?php
$dbconn = pg_connect($DSN);
pg_query($dbconn, 'START TRANSACTION;');
pg_query($dbconn, "DECLARE c CURSOR FOR SELECT i, 'Line '||i FROM
generate_series(1,100) AS i");
while(pg_num_rows($result = pg_query($dbconn, 'FETCH 10 FROM c')) > 0) {
while( $result = pg_fetch_row($result) ) {
echo "Row: $row[0], $row[1]n";
}
readline('<enter>');
}
pg_query($dbconn, 'CLOSE c;');
pg_query($dbconn, 'COMMIT TRANSACTION;');
?>
Prepared Statements
Preparando execução de queries no banco
<?php
$dbconn = pg_connect($DSN);
pg_prepare($dbconn, 'insert_bar',
'INSERT INTO bar(a, b, d) VALUES ($1, $2, $3);');
for($i=1; $i<=10; $i++) {
echo "Inserting item $i into 'bar' tablen";
pg_execute($dbconn,
'insert_bar', array($i, "Item $i", $i*2));
}
?>
Async Prepared Statements
● pg_send_prepare
● pg_send_execute
Ferramentas
Algumas ferramentas de apoio
Debug através dos Logs
log_line_prefix = '%t [%p]: [%l-1] db=%d,user=%u,app=%a,client=%h '
log_lock_waits = on
log_min_duration_statement = 0
log_connections = on
log_disconnections = on
http://www.savepoint.blog.br/2015/01/20/trabalhando-com-logs-no-postgresql/
pgBadger
● ferramenta análise de logs
● descobrir queries lentas/frequentes
● bloqueios (locks)
● estatísticas de acessos e execução de queries
● estatísticas sobre vacuum/analyze
● uso de arquivos temporários
● sessões, checkpoints, ...
pgbouncer
● pool de conexões
○ session, transaction, statement
● uma espécie de “database proxy”
● dica: use com haproxy para criar um cluster “read-only” com
distribuição de carga
pREST
● Transforma seu PostgreSQL em uma API REST
● Mantém um pool interno de conexões
● Além de operações CRUD sobre uma relação
○ junções
○ execução de scripts SQL armazenados servidor
https://postgres.rest
contato@timbira.com.br

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

SPI Drivers
SPI DriversSPI Drivers
SPI Drivers
 
Programação Orientado a Objetos
Programação Orientado a ObjetosProgramação Orientado a Objetos
Programação Orientado a Objetos
 
Simplex, Half-Duplex e Full-Duplex
Simplex, Half-Duplex e Full-DuplexSimplex, Half-Duplex e Full-Duplex
Simplex, Half-Duplex e Full-Duplex
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 
AVRO to JSON Conversion
AVRO to JSON ConversionAVRO to JSON Conversion
AVRO to JSON Conversion
 
Camada de aplicação modelo osi
Camada de aplicação modelo osiCamada de aplicação modelo osi
Camada de aplicação modelo osi
 
Cisc, risc e pipeline
Cisc, risc e pipelineCisc, risc e pipeline
Cisc, risc e pipeline
 
Crud
CrudCrud
Crud
 
VPN - O que é a VPN?
VPN - O que é a VPN?VPN - O que é a VPN?
VPN - O que é a VPN?
 
Arquitetura de Computadores: Assembly
Arquitetura de Computadores: AssemblyArquitetura de Computadores: Assembly
Arquitetura de Computadores: Assembly
 
Acessando o MySql com o Python
Acessando o MySql com o PythonAcessando o MySql com o Python
Acessando o MySql com o Python
 
Aula 5a - Sistemas Operacionais
Aula 5a - Sistemas OperacionaisAula 5a - Sistemas Operacionais
Aula 5a - Sistemas Operacionais
 
OLTP+OLAP=HTAP
 OLTP+OLAP=HTAP OLTP+OLAP=HTAP
OLTP+OLAP=HTAP
 
Accelerating Envoy and Istio with Cilium and the Linux Kernel
Accelerating Envoy and Istio with Cilium and the Linux KernelAccelerating Envoy and Istio with Cilium and the Linux Kernel
Accelerating Envoy and Istio with Cilium and the Linux Kernel
 
Protocolo Http
Protocolo HttpProtocolo Http
Protocolo Http
 
Java modulo 01 - Introdução
Java modulo 01 - IntroduçãoJava modulo 01 - Introdução
Java modulo 01 - Introdução
 
syzkaller: the next gen kernel fuzzer
syzkaller: the next gen kernel fuzzersyzkaller: the next gen kernel fuzzer
syzkaller: the next gen kernel fuzzer
 
Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.js
 
Projeto de-rede-escola-particular
Projeto de-rede-escola-particularProjeto de-rede-escola-particular
Projeto de-rede-escola-particular
 
Modelo TCP/IP
Modelo TCP/IPModelo TCP/IP
Modelo TCP/IP
 

Ähnlich wie PHP e PostgreSQL: Um é pouco, dois é bom, três é demais

Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação Web
Dalton Martins
 
Aula 12 Relatório - Tabelas
Aula 12   Relatório - TabelasAula 12   Relatório - Tabelas
Aula 12 Relatório - Tabelas
Dalton Martins
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - Funções
Carlos Santos
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
Regis Magalhães
 

Ähnlich wie PHP e PostgreSQL: Um é pouco, dois é bom, três é demais (20)

Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação Web
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
 
Doctrine for Dummies
Doctrine for DummiesDoctrine for Dummies
Doctrine for Dummies
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHP
 
Pdo do PHP Palestra
Pdo do PHP PalestraPdo do PHP Palestra
Pdo do PHP Palestra
 
Palestra PHPSP+Locaweb 2014 - PDO
Palestra PHPSP+Locaweb 2014 - PDOPalestra PHPSP+Locaweb 2014 - PDO
Palestra PHPSP+Locaweb 2014 - PDO
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
PHP Aula07 - conexão Com Banco de Dados
PHP Aula07 - conexão Com Banco de DadosPHP Aula07 - conexão Com Banco de Dados
PHP Aula07 - conexão Com Banco de Dados
 
Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php seguros
 
PHP GERAL
PHP GERALPHP GERAL
PHP GERAL
 
Aula 12 Relatório - Tabelas
Aula 12   Relatório - TabelasAula 12   Relatório - Tabelas
Aula 12 Relatório - Tabelas
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - Funções
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Php 02 Primeiros Passos
Php 02 Primeiros PassosPhp 02 Primeiros Passos
Php 02 Primeiros Passos
 
Php 07 Cakephp
Php 07 CakephpPhp 07 Cakephp
Php 07 Cakephp
 
Desenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyDesenvolvimento Mobile com Ruby
Desenvolvimento Mobile com Ruby
 

Mehr von Fabrízio Mello

Mehr von Fabrízio Mello (20)

Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
 
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...
 
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
 
GSoC2014 - PGDay Ijui/RS Presentation October, 2016
GSoC2014 - PGDay Ijui/RS Presentation October, 2016 GSoC2014 - PGDay Ijui/RS Presentation October, 2016
GSoC2014 - PGDay Ijui/RS Presentation October, 2016
 
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
 
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP) NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
 
Como posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQLComo posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQL
 
Keep calm and Database Continuous Deployment
Keep calm and Database Continuous DeploymentKeep calm and Database Continuous Deployment
Keep calm and Database Continuous Deployment
 
GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015
 
GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015
 
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de DadosPROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
 
Bad Smells em Bancos de Dados
Bad Smells em Bancos de DadosBad Smells em Bancos de Dados
Bad Smells em Bancos de Dados
 
Tutorial Database Refactoring
Tutorial Database RefactoringTutorial Database Refactoring
Tutorial Database Refactoring
 
Sharing Code and Experiences
Sharing Code and ExperiencesSharing Code and Experiences
Sharing Code and Experiences
 
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
 
Software Delivery Like a Boss
Software Delivery Like a BossSoftware Delivery Like a Boss
Software Delivery Like a Boss
 
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
 
Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)
 
Dojo plpgsql
Dojo plpgsqlDojo plpgsql
Dojo plpgsql
 
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
 

Kürzlich hochgeladen

Kürzlich hochgeladen (8)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

PHP e PostgreSQL: Um é pouco, dois é bom, três é demais

  • 1. PHP e PostgreSQL Um é pouco, dois é bom, três é demais Fabrízio de Royes Mello @fabriziomello
  • 2. Fabrízio de Royes Mello • Empreendedor • Colaborador PostgreSQL
  • 3.
  • 4.
  • 5. Não sou um programador PHP… já tentei um dia mas...
  • 7. $ git clone > git@github.com:fabriziomello/phpconference.git $ cd phpconference $ vagrant up $ vagrant ssh $ cd /mnt/bootstrap/php
  • 8. <?php // Connection string $DSN = "host=localhost port=5432 user=phpconference dbname=phpconference password=phpconference"; ?>
  • 9. Async Connection Aguarde conexão executando sua lógica
  • 10. <?php // Try to connect to database phpconference $dbconn = pg_connect($DSN, PGSQL_CONNECT_ASYNC); // Wait for connection ... while( pg_connect_poll($dbconn) <> PGSQL_POLLING_OK ) { echo "Waiting for connection ...n"; usleep(100000); } echo "Connected ...n"; ?>
  • 11. Async Query Execute sua lógica enquanto aguarda SQL
  • 12. <?php $dbconn = pg_connect($DSN); $query = "WITH rnd AS (SELECT random()*5 AS n) SELECT pg_sleep(n), n, 'Some string' FROM rnd"; $secs = 0; if( !pg_connection_busy($dbconn) ) { $sent = pg_send_query($dbconn, $query); while( pg_connection_busy($dbconn) ) { $secs++; echo "Waiting $secs seconds ...n"; sleep(1); } $result = pg_get_result($dbconn); var_dump(pg_fetch_row($result)); ?>
  • 13. LISTEN / NOTIFY Notificações Assíncronas com PostgreSQL
  • 14. <?php $dbconn = pg_connect($DSN); pg_query($conn, 'LISTEN chat_room_1;'); while(1) { $notify = pg_get_notify($conn); if (!$notify) { echo "No messagesn"; } else { print_r($notify); } sleep(1); } ?>
  • 15. Bulk Load Inserir dados em blocos no banco de dados
  • 16. <?php $dbconn = pg_connect($DSN); pg_query($dbconn, "CREATE TABLE bar (a INT4, b CHAR(16), d NUMERIC)"); pg_query($dbconn, "COPY bar FROM stdin"); pg_put_line($dbconn, "3thello worldt4.5n"); pg_put_line($dbconn, "4tgoodbye worldt7.11n"); pg_put_line($dbconn, ".n"); pg_end_copy($dbconn); ?>
  • 17. Dica “Unlogged Tables” • tipo especial de tabela que não gera Logs de Transação • tornam operações de escrita muito performática • não são “crash-safe” • não replicam pois não geram Logs de Transação • se combinado com COPY em alguns cenários pode ser de 10x a 100x mais (ou mais) rápido que INSERT em tabela regular
  • 18. Cursores Lendo blocos de registros do banco
  • 19. <?php $dbconn = pg_connect($DSN); pg_query($dbconn, 'START TRANSACTION;'); pg_query($dbconn, "DECLARE c CURSOR FOR SELECT i, 'Line '||i FROM generate_series(1,100) AS i"); while(pg_num_rows($result = pg_query($dbconn, 'FETCH 10 FROM c')) > 0) { while( $result = pg_fetch_row($result) ) { echo "Row: $row[0], $row[1]n"; } readline('<enter>'); } pg_query($dbconn, 'CLOSE c;'); pg_query($dbconn, 'COMMIT TRANSACTION;'); ?>
  • 21. <?php $dbconn = pg_connect($DSN); pg_prepare($dbconn, 'insert_bar', 'INSERT INTO bar(a, b, d) VALUES ($1, $2, $3);'); for($i=1; $i<=10; $i++) { echo "Inserting item $i into 'bar' tablen"; pg_execute($dbconn, 'insert_bar', array($i, "Item $i", $i*2)); } ?>
  • 22. Async Prepared Statements ● pg_send_prepare ● pg_send_execute
  • 24. Debug através dos Logs log_line_prefix = '%t [%p]: [%l-1] db=%d,user=%u,app=%a,client=%h ' log_lock_waits = on log_min_duration_statement = 0 log_connections = on log_disconnections = on http://www.savepoint.blog.br/2015/01/20/trabalhando-com-logs-no-postgresql/
  • 25. pgBadger ● ferramenta análise de logs ● descobrir queries lentas/frequentes ● bloqueios (locks) ● estatísticas de acessos e execução de queries ● estatísticas sobre vacuum/analyze ● uso de arquivos temporários ● sessões, checkpoints, ...
  • 26. pgbouncer ● pool de conexões ○ session, transaction, statement ● uma espécie de “database proxy” ● dica: use com haproxy para criar um cluster “read-only” com distribuição de carga
  • 27. pREST ● Transforma seu PostgreSQL em uma API REST ● Mantém um pool interno de conexões ● Além de operações CRUD sobre uma relação ○ junções ○ execução de scripts SQL armazenados servidor https://postgres.rest
  • 28.
  • 29.