Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Para uma conexão do Protocolo de Controle de Transmissão (TCP) sem uma porta explícita, a porta padrão é 1433. Conexões de instâncias nomeadas podem usar o SQL Server Browser para descobrir a porta da instância. Para selecionar TCP e uma porta específica explicitamente, use tcp:<server>,<port>. Para informações sobre como configurar o lado do servidor, veja Configurar um servidor para ouvir em uma porta TCP específica.
Prepare o endpoint
- Peça ao administrador do servidor o nome do host e a porta TCP. Uma cadeia de conexão de cliente não altera a porta na qual o SQL Server escuta.
- Permita que essa porta passe pelo firewall do servidor e pelos controles de rede intermediários.
- Defina
SQL_SERVERapenas como o nome do host,SQL_PORTcomo o número decimal da porta eSQL_DATABASEcomo o nome do banco de dados. Os programas constroemtcp:<server>,<port>. Use uma vírgula antes da porta, não dois-pontos. - Defina
SQL_USEReSQL_PASSWORDpor meio da configuração de processo protegido para estes exemplos de autenticação SQL. Para autenticação integrada ou Microsoft Entra, use as configurações apropriadas de credenciais de Conexão ao servidor.
Uma porta explícita evita a descoberta da porta da instância via SQL Server Browser. Mantenha o nome do host do servidor consistente com o certificado dele. Nenhum dos exemplos desativa a validação de certificados.
Armazene o nome real do banco de dados, nome de usuário e senha nas variáveis de ambiente. Ambos os programas escapam esses valores uma vez para o tratamento de conexão no estilo ODBC do driver PHP, dobrando as chaves de fechamento e envolvendo cada valor em chaves. Para mais informações, veja Conectando ao servidor.
SQLSRV
Salve este programa como connect-port-sqlsrv.php, e execute php connect-port-sqlsrv.php.
<?php
$config = [];
foreach (['SQL_SERVER', 'SQL_PORT', 'SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$value = getenv($name);
if ($value === false || $value === '') {
throw new RuntimeException("Set $name before running this example.");
}
$config[$name] = $value;
}
foreach (['SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$config[$name] = '{' . str_replace('}', '}}', $config[$name]) . '}';
}
$port = filter_var($config['SQL_PORT'], FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1, 'max_range' => 65535],
]);
if ($port === false) {
throw new RuntimeException('SQL_PORT must be an integer from 1 through 65535.');
}
$serverName = 'tcp:' . $config['SQL_SERVER'] . ',' . $port;
$conn = sqlsrv_connect($serverName, [
'Database' => $config['SQL_DATABASE'],
'UID' => $config['SQL_USER'],
'PWD' => $config['SQL_PASSWORD'],
'Encrypt' => true,
'TrustServerCertificate' => false,
'LoginTimeout' => 30,
]);
if ($conn === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
$stmt = null;
try {
$stmt = sqlsrv_query($conn, 'SELECT CAST(1 AS int) AS Connected');
if ($stmt === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
if ($row === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
if ($row !== ['Connected' => 1]) {
throw new RuntimeException('Unexpected connection-test result.');
}
echo "Connected on TCP port $port.", PHP_EOL;
} finally {
if (is_resource($stmt)) {
sqlsrv_free_stmt($stmt);
}
sqlsrv_close($conn);
}
PDO_SQLSRV
Salve esse programa separado como connect-port-pdo.php, e execute php connect-port-pdo.php com a mesma configuração.
<?php
$config = [];
foreach (['SQL_SERVER', 'SQL_PORT', 'SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$value = getenv($name);
if ($value === false || $value === '') {
throw new RuntimeException("Set $name before running this example.");
}
$config[$name] = $value;
}
foreach (['SQL_DATABASE', 'SQL_USER', 'SQL_PASSWORD'] as $name) {
$config[$name] = '{' . str_replace('}', '}}', $config[$name]) . '}';
}
$port = filter_var($config['SQL_PORT'], FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1, 'max_range' => 65535],
]);
if ($port === false) {
throw new RuntimeException('SQL_PORT must be an integer from 1 through 65535.');
}
$serverName = 'tcp:' . $config['SQL_SERVER'] . ',' . $port;
$database = $config['SQL_DATABASE'];
$pdo = new PDO(
"sqlsrv:Server=$serverName;Database=$database;Encrypt=true;"
. "TrustServerCertificate=false;LoginTimeout=30",
$config['SQL_USER'],
$config['SQL_PASSWORD'],
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$stmt = null;
try {
$stmt = $pdo->query('SELECT CAST(1 AS int) AS Connected');
if ($stmt->fetch(PDO::FETCH_ASSOC) !== ['Connected' => '1']) {
throw new RuntimeException('Unexpected connection-test result.');
}
echo "Connected on TCP port $port.", PHP_EOL;
} finally {
$stmt = null;
$pdo = null;
}
Para SQL_PORT=1433, qualquer um dos programas imprime:
Connected on TCP port 1433.
O int buscado é nulo no PHP int no SQLSRV e uma string por padrão no PDO_SQLSRV. A porta faz parte do argumento servidor para SQLSRV e parte da Server palavra-chave DSN para PDO_SQLSRV. Não existe uma palavra-chave PDO Port separada nesse padrão.
Solucionar problemas de seleção de porta
| Sintoma | Action |
|---|---|
| Uma instância nomeada funciona, mas uma porta explícita não | Confirme a porta de escuta real. A instância pode usar uma porta dinâmica que mudou após um reinício. |
| O TCP atinge o tempo limite | Verifique o listener e o firewall do host PHP. Uma porta aberta ainda não prova que a autenticação SQL terá sucesso. |
| A validação do nome do certificado falha após usar um endereço IP | Use o nome do host no certificado com a porta especificada. Não desative a validação para compensar a mudança de nome. |
| A aplicação ainda se conecta em outro lugar | Verifique o ambiente do processo PHP em execução e a configuração de servidor gerada, sem imprimir credenciais. Reinicie o processo do aplicativo se a configuração exigir. |
A seleção de TCP e a descoberta de instâncias pertencem ao ODBC e à configuração de rede do servidor. O PHP fornece o endpoint e reporta o resultado da conexão. Para Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, Azure Synapse Analytics, banco de dados SQL no Fabric ou Warehouse no Fabric, mantenham o endpoint e a porta fornecidos pelo serviço em vez de escolher uma porta arbitrária. Os programas de login SQL não são exemplos de autenticação para nenhum dos produtos Fabric. Para mais informações, veja conexões Azure e Fabric.