CakeFest 2024: The Official CakePHP Conference

Conexões

O servidor MySQL suporta o uso de diferentes camadas de transporte para conexões. Conexões usam TCP/IP, sockets de domínio Unix ou pipes nomeados do Windows.

O nome de servidor localhost tem um significado especial. Ele é vinculado ao uso de sockets de domínio Unix. Para abrir uma conexão TCP/IP ao servidor local, 127.0.0.1 deve ser usado ao invés do nome localhost.

Exemplo #1 Significado especial de localhost

<?php

$mysqli
= new mysqli("localhost", "user", "password", "database");

echo
$mysqli->host_info . "\n";

$mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);

echo
$mysqli->host_info . "\n";

O exemplo acima produzirá:

Localhost via UNIX socket
127.0.0.1 via TCP/IP

Padrão dos parâmetros de conexão

Dependendo da função de conexão usada, alguns parâmetros podem ser omitidos. Se um parâmetro não for fornecido, a extensão tenta usar os valores padrões definidos no arquivo de configuração do PHP.

Exemplo #2 Padrões de configuração

mysqli.default_host=192.168.2.27
mysqli.default_user=root
mysqli.default_pw=""
mysqli.default_port=3306
mysqli.default_socket=/tmp/mysql.sock

Os valores dos parâmetros resultantes são então passados à biblioteca cliente que é usada pela extensão. Se a biblioteca cliente detecta parâmetros vazios ou indefinidos, ela pode usar seus próprios valores padrão internos.

Padrões de conexão internos da biblioteca

Se o valor do servidor for indefinido ou vazio, a biblioteca cliente irá considerar uma conexão socket Unix em localhost. Se o socket for indefinido ou vazio, e uma conexão socket Unix for solicitada, é feita tentativa de conexão ao socket padrão em /tmp/mysql.sock.

Em sistemas Windows, o nome de servidor '.' é interpretado pela biblioteca cliente como uma tentativa de se abrir uma conexão baseada em pipe nomeado do Windows. Neste caso, o parâmetro socket é interpretado como o nome do pipe. Se não informado ou vazio, o socket (nome do pipe) será igual ao padrão \\.\pipe\MySQL.

Se a conexão a ser estabelecida não for baseada em socket de domínio Unix nem em pipe nomeado Windows, e o parâmetro da porta estiver indefinido, a biblioteca usará o valor padrão de porta 3306.

A biblioteca mysqlnd e a Biblioteca Cliente MySQL (libmysqlclient) implementam a mesma lógica para determinar os padrões.

Opções de conexão

Opções de conexão estão disponíveis para, por exemplo, definir comando de inicialização que são executados na conexão, ou para requisitar uso de um conjunto de caracteres específico. Opções de conexão devem ser definidas antes que uma conexão seja estabelecida.

Para definir uma opção de conexão, a operação de conexão deve ser realizada em três passos: criar um manipulador de conexão com mysqli_init() ou mysqli::__construct(), definir as opções necessárias usando mysqli::options(), e estabelecer a conexão à rede com mysqli::real_connect().

Agrupamento de conexão

A extensão mysqli suporta conexões persistentes de banco de dados, que são um tipo especial de conexões agrupadas. Por padrão, cada conexão ao banco aberta por um script é explicitamente fechada pelo usuário durante a execução ou liberada automaticamente ao final do script. Com uma conexão permanente isso não acontece. Ao invés disso, ela é colocada em um grupo para reúso posterior, se uma conexão ao mesmo servidor, usando o mesmo usuário, senha, socket, porta e banco de dados padrão, for aberta. O reúso economiza tempo e reduz a sobrecarga de conexão.

Cada processo do PHP usa seu próprio agrupamento de conexões mysqli. Dependendo do modelo de implantação do servidor web, um processo PHP pode servir a uma ou múltiplas requisições. Portanto, uma conexão agrupada pode ser usada por um ou mais scripts subsequentemente.

Conexão persistente

Se uma conexão persistente sem uso para uma certa combinação de servidor, usuário, senha, socket, porta e banco padrão não puder ser encontrada no agrupamento, a extensão mysqli abre uma nova conexão. O uso de conexões persistentes pode ser habilitado e desabilitado usando a diretiva mysqli.allow_persistent do PHP. O número total de conexões abertas por um script pode ser limitado com mysqli.max_links. O número máximo de conexões persistentes por processo PHP pode ser restringido com mysqli.max_persistent. Favor observar que o servidor web pode gerar muitos processos PHP.

Uma queixa comum sobre conexões permanentes é que seus estados não são redefinidos antes do reúso. Por exemplo, transações abertas e não terminadas não são automaticamente desfeitas. Além disso, mudanças de autorização, que aconteceram no intervalo entre a inserção da conexão no agrupamento e seu reúso, não terão efeito. Isto pode ser visto como um efeito colateral indesejado. De outro modo, o nome persistente pode ser entendido como uma promessa de que o estado da conexão irá persistir..

A extensão mysqli suporta ambas as interpretações de conexão persistente: persistência do estado, e redefinição do estado, antes do reúso. O padrão é redefinição. Antes que uma conexão persistente seja reutilizada, a extensão mysqli chama mysqli::change_user() implicitamente para redefinir o estado. A conexão persistente aparece ao usuário como se tivesse acabado de ser aberta. Nenhum artefato de usos anteriores é visível.

A chamada a mysqli::change_user() é uma operação custosa. Para melhor desempenho, usuários podem querer recompilar a extensão com a opção MYSQLI_NO_CHANGE_USER_ON_PCONNECT definida.

É deixado ao usuário a escolha entre comportamento seguro e melhor desempenho. Ambos são objetivos de otimização válidos. Para facilidade de uso, o comportamento seguro foi escolhido como padrão com o prejuízo do desempenho.

Veja também

add a note

User Contributed Notes 1 note

up
-36
xylene2301 at gmail dot com
1 year ago
"The hostname localhost has a special meaning. It is bound to the use of Unix domain sockets. To open a TCP/IP connection to the localhost, 127.0.0.1 must be used instead of the hostname localhost."

Is there something I missed or is this 1st provision incorrect?
On windows11, using PHP 7.4 and MySQL 8,

$conn = new mysqli("localhost", "root", "pword", "tstDB");
echo $conn->host_info . "\n";

returns:
localhost via TCP/IP Connected to the database.
To Top