Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Para una conexión del Protocolo de Control de Transmisión (TCP) sin un puerto explícito, el puerto predeterminado es 1433. Las conexiones de instancia con nombre pueden usar SQL Server Browser para descubrir el puerto de la instancia. Para seleccionar TCP y un puerto específico explícitamente, use tcp:<server>,<port>. Para información sobre cómo configurar el lado del servidor, consulte Configurar un servidor para escuchar en un puerto TCP específico.
Prepara el endpoint
- Pide al administrador del servidor el nombre del host y el puerto TCP. Una cadena de conexión de cliente no cambia el puerto en el que escucha SQL Server.
- Permite que ese puerto pase por el cortafuegos del servidor y los controles de red intermedios.
- Establece
SQL_SERVERsolo con el nombre del host,SQL_PORTcon el número de puerto decimal ySQL_DATABASEcon el nombre de la base de datos. Los programas construyentcp:<server>,<port>. Utiliza una coma antes del puerto, no dos puntos. - Configura
SQL_USERySQL_PASSWORDmediante la configuración de procesos protegidos para estos ejemplos de autenticación SQL. Para autenticación integrada o Microsoft Entra, utiliza la configuración de credenciales correspondiente de Conexión al servidor.
Un puerto explícito evita el descubrimiento de puertos de instancia a través de SQL Server Browser. Mantén el nombre del host del servidor coherente con su certificado. Ninguno de los dos ejemplos desactiva la validación del certificado.
Almacena el nombre real de la base de datos, nombre de usuario y contraseña en las variables de entorno. Ambos programas escapan estos valores una vez para el manejo de conexiones al estilo ODBC del controlador PHP, duplicando las llaves de cierre y encerrando cada valor entre llaves. Para más información, consulta Conexión al servidor.
SQLSRV
Guarda este programa como connect-port-sqlsrv.php, y ejecuta 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
Guarda este programa separado como connect-port-pdo.php, y ejecuta php connect-port-pdo.php con la misma configuración.
<?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, cualquiera de los dos programas muestra el siguiente mensaje:
Connected on TCP port 1433.
El valor int obtenido es PHP int en SQLSRV y una cadena de forma predeterminada en PDO_SQLSRV. El puerto forma parte del argumento del servidor para SQLSRV y parte de la Server palabra clave DSN para PDO_SQLSRV. No existe una palabra clave PDO Port separada en este patrón.
Solucionar problemas de selección de puertos
| Síntoma | Action |
|---|---|
| Una instancia con nombre funciona, pero un puerto explícito no | Confirma el puerto real de escucha. La instancia podría usar un puerto dinámico que cambió tras un reinicio. |
| Se agota el tiempo de espera de TCP | Comprueba el listener y el firewall del host de PHP. Un puerto abierto aún no demuestra que la autenticación SQL vaya a funcionar. |
| La validación del nombre del certificado falla tras usar una dirección IP | Utiliza el nombre de host que figura en el certificado con el puerto explícito. No desactives la validación para compensar el cambio de nombre. |
| La aplicación sigue conectándose a otro lugar | Comprueba el entorno del proceso PHP en ejecución y la configuración generada del servidor, sin imprimir credenciales. Reinicia el proceso de la aplicación si su configuración lo requiere. |
La selección de TCP y el descubrimiento de instancias pertenecen a ODBC y a la configuración de red del servidor. PHP proporciona el endpoint y reporta el resultado de la conexión. Para Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL database en Fabric o Warehouse en Fabric, conserve el endpoint y puerto suministrados por el servicio en lugar de elegir un puerto arbitrario. Los programas de inicio de sesión SQL no son ejemplos de autenticación para ninguno de los dos productos Fabric. Para más información, véase conexiones de Azure y Fabric.