Conexões e gerenciamento de conexões
As conexões são estabelecidas criando instâncias da classe base PDO. Não importa qual driver você deseja usar; você sempre usa o nome da classe PDO. O construtor aceita parâmetros para especificar a fonte do banco de dados (conhecida como DSN) e opcionalmente para o nome de usuário e senha (se houver).
Example #1 Conectando-se ao MySQL
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>
Se houver algum erro de conexão, um objeto PDOException
será lançado. Você pode capturar a exceção se quiser lidar com a
condição de erro, ou pode optar por deixá-la para um manipulador de exceção
global do aplicativo que você configurou via
set_exception_handler().
Example #2 Tratando erros de conexão
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (PDOException $e) {
// tentar reconectar após algum intervalo, por exemplo
}
Assim como qualquer outra exceção,
PDOException pode ser capturada explicitamente, via
uma instrução catch
, ou implicitamente através de set_exception_handler().
Caso contrário, o comportamento padrão de converter uma exceção não capturada em um
E_FATAL_ERROR
ocorrerá.
O erro fatal conterá uma rastreabilidade que pode vazar detalhes da conexão.
Portanto, a opção php.ini
display_errors
deve ser definida como 0
em um servidor de produção.
Após a conexão bem-sucedida com o banco de dados, uma instância da classe PDO
é retornada para seu script. A conexão permanece ativa pelo
tempo de vida desse objeto PDO. Para fechar a conexão, você precisa
destruir o objeto garantindo que todas as referências restantes a ele sejam
deletadas - você faz isso atribuindo null
à variável que mantém o
objeto. Se você não fizer isso explicitamente, o PHP fechará automaticamente
a conexão quando seu script terminar.
Note: Se ainda houver outras referências a esta instância PDO (como de uma instância PDOStatement, ou de outras variáveis referenciando a mesma instância PDO), estas também devem ser removidas (por exemplo, atribuindo
null
à variável que referencia a instância PDOStatement).
Example #3 Fechando uma conexão
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// use a conexão aqui
$sth = $dbh->query('SELECT * FROM foo');
// e agora terminamos; feche-a
$sth = null;
$dbh = null;
?>
Muitas aplicações web se beneficiarão com a realização de conexões persistentes com servidores de banco de dados. As conexões persistentes não são fechadas no final do script, mas são armazenadas em cache e reutilizadas quando outro script solicita uma conexão usando as mesmas credenciais. O cache de conexão persistente permite evitar a sobrecarga de estabelecer uma nova conexão toda vez que um script precisa se comunicar com um banco de dados, resultando em uma aplicação web mais rápida.
Example #4 Conexões persistentes
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
O valor da opção PDO::ATTR_PERSISTENT
é convertido para
bool (ativar/desativar conexões persistentes), a menos que seja uma
string não numérica, caso em que permite usar vários pools de conexões persistentes.
Isso é útil se diferentes conexões usam configurações incompatíveis, por exemplo,
valores diferentes de PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
.
Note:
Se desejar usar conexões persistentes, você deve definir
PDO::ATTR_PERSISTENT
no array de opções do driver passadas para o construtor PDO. Se definir este atributo com PDO::setAttribute() após a instanciação do objeto, o driver não usará conexões persistentes.
Note:
Se estiver usando o driver PDO ODBC e suas bibliotecas ODBC suportarem Pool de Conexões ODBC (unixODBC e Windows são duas que suportam; pode haver mais), então é recomendável que você não use conexões PDO persistentes e, em vez disso, deixe o cache de conexão para a camada de Pool de Conexões ODBC. O Pool de Conexões ODBC é compartilhado com outros módulos no processo; se o PDO for instruído a armazenar em cache a conexão, então essa conexão nunca seria retornada ao pool de conexões ODBC, resultando em conexões adicionais sendo criadas para atender a esses outros módulos.