Connessione al database SQL di Microsoft Azure

Scarica il driver PHP

I driver SQLSRV e PDO_SQLSRV si collegano ai seguenti Azure e Fabric target SQL con un nome server completamente qualificato e le opzioni di connessione nelle Connection options. SQLSRV prende un array di opzioni; PDO_SQLSRV assume un nome di sorgente dati (DSN), argomenti di credenziali separati quando necessario e attributi PDO.

Target Modulo del nome del server Note
Database SQL di Microsoft Azure <server>.database.windows.net
Istanza gestita di SQL di Azure (Istanza gestita di Azure SQL) L'endpoint pubblico o privato della tua istanza Richiede connettività di rete tramite una rete virtuale, una rete privata virtuale (VPN) o un endpoint pubblico.
Azure Synapse Analytics (pool SQL dedicato in uno spazio di lavoro) <workspace>.sql.azuresynapse.net Le istruzioni Transact-SQL supportate (T-SQL) differiscono da quelle di SQL Server. Per la sintassi supportata, consulta la documentazione di Synapse SQL.
Database SQL di Microsoft Fabric Copia il server e il database dalle Impostazioni> dell'elemento database Usa la connessione SQL al database, non il suo endpoint di analisi SQL. L'autenticazione Microsoft Entra è obbligatoria. Per altre informazioni, vedere Connettersi al database SQL in Fabric.
Magazzino in Microsoft Fabric Copia la stringa di connessione SQL del warehouse dal portale Fabric Imposta Database sul nome del magazzino e MultipleActiveResultSets su false. L'autenticazione Microsoft Entra è obbligatoria. Per altre informazioni, vedere Connettività del magazzino.

Entrambe le estensioni PHP abilitano di default i Multiple Active Result Sets (MARS). Warehouse non supporta MARS, quindi disabilitalo esplicitamente nell'array di opzioni SQLSRV o PDO_SQLSRV DSN. SQL database in Fabric e Warehouse sono prodotti separati; non dare per scontato che una funzionalità supportata da uno sia supportata dall'altro.

Prepara endpoint, identità e host PHP

Il tuo processo PHP necessita di accesso di rete all'endpoint SQL, di un modo supportato per accedere e del permesso di aprire il database selezionato. Controlla ogni requisito separatamente. Ad esempio, aprire una porta firewall non concede l'accesso al database.

  1. Installa l'estensione PHP e il driver Microsoft ODBC sulla macchina o sul container che esegue PHP. Verifica che l'estensione sia caricata in quel processo, non solo in un terminale di sviluppo. Per ulteriori informazioni, vedi Caricamento dei driver.
  2. Copia il server e il database dai dettagli di connessione del target. Non includere uno schema di URL HTTPS. Usa il nome host fornito dal servizio in modo che la validazione del certificato controlli l'endpoint previsto. Un endpoint pubblico Istanza gestita di SQL di Azure può includere una porta non predefinita; mantenere la porta fornita.
  3. Configura l'accesso alla rete del servizio per il tuo host PHP. Per un endpoint privato, conferma la risoluzione del nome privato e verifica la presenza di un percorso dalla rete dell'applicazione. Una regola di firewall pubblico non fornisce un percorso verso un indirizzo privato.
  4. Scegli l'identità utilizzata dal processo PHP. Per un'applicazione ospitata su Azure, abilita la sua identità gestita e identifica se è assegnata al sistema o all'utente. L'accesso interfaccia della riga di comando di Azure di uno sviluppatore non è l'identità gestita dell'applicazione.
  5. Far concedere da un amministratore del database a quell'identità l'accesso al database selezionato e i permessi minimi richiesti dall'applicazione. Per Warehouse, controlla anche l'accesso agli elementi/all'area di lavoro di Fabric. I permessi di gestione delle risorse di Azure da soli non concedono il permesso di interrogare le tabelle delle applicazioni.
  6. Impostate SQL_SERVER e SQL_DATABASE nella configurazione dell'applicazione. Non memorizzare una password per gli esempi di identità gestita.

Gli esempi verificano una connessione senza creare tabelle. Superare questo controllo non dimostra che l'identità può leggere o scrivere lo schema della tua applicazione. Testa le operazioni effettive separatamente con la stessa identità.

Usa l'autenticazione Microsoft Entra senza password

Usa un'identità gestita quando il tuo ambiente di hosting espone un endpoint con identità gestita e il target SQL concede l'accesso a quell'identità. I seguenti programmi completi utilizzano un'identità gestita assegnata al sistema. Non sono esempi di workstation. Eseguili sull'host Azure configurato, con SQL_SERVER e SQL_DATABASE disponibili per il suo processo PHP.

Entrambi i programmi disabilitano MARS, quindi anche l'impostazione di connessione è adatta quando si seleziona Warehouse. Usano una sola istruzione condizionale attiva alla volta. Per la configurazione dell'identità e altre modalità di autenticazione, vedi Connetti usando l'autenticazione Microsoft Entra.

Imposta SQL_DATABASE sul nome effettivo del database. Ogni programma crea un valore separato con caratteri di escape per la connessione raddoppiando le parentesi di chiusura e racchiudendo il nome tra parentesi graffe. L'escape impedisce ai caratteri speciali nel nome del database di modificare il modo in cui il driver legge le impostazioni di connessione. I programmi mantengono il nome originale per verificare il risultato di DB_NAME().

SQLSRV

Salva questo programma come connect-azure-sqlsrv.php, ed esegui php connect-azure-sqlsrv.php sull'host configurato.

<?php
$server = getenv('SQL_SERVER');
$database = getenv('SQL_DATABASE');
if ($server === false || $server === '' || $database === false || $database === '') {
    throw new RuntimeException('Set SQL_SERVER and SQL_DATABASE.');
}
$databaseValue = '{' . str_replace('}', '}}', $database) . '}';

$conn = sqlsrv_connect($server, [
    'Database' => $databaseValue,
    'Authentication' => 'ActiveDirectoryMsi',
    'Encrypt' => true,
    'TrustServerCertificate' => false,
    'LoginTimeout' => 30,
    'MultipleActiveResultSets' => false,
    'CharacterSet' => 'UTF-8',
]);
if ($conn === false) {
    throw new RuntimeException(print_r(sqlsrv_errors(), true));
}

$stmt = null;
try {
    $stmt = sqlsrv_query(
        $conn,
        'SELECT DB_NAME() AS DatabaseName, CAST(1 AS int) AS Connected',
        [],
        ['QueryTimeout' => 30]
    );
    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 !== ['DatabaseName' => $database, 'Connected' => 1]) {
        throw new RuntimeException('Unexpected database or connection result.');
    }
    echo 'Connected to ', $row['DatabaseName'], '.', PHP_EOL;
} finally {
    if (is_resource($stmt)) {
        sqlsrv_free_stmt($stmt);
    }
    sqlsrv_close($conn);
}

PDO_SQLSRV

Salva questo programma separato come connect-azure-pdo.php, ed esegui php connect-azure-pdo.php sull'host configurato. Imposta PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE così il risultato int è PHP int. Senza di esso, PDO_SQLSRV restituisce questa colonna come stringa di default. La codifica PDO è un attributo, non l'opzione SQLSRV CharacterSet .

<?php
$server = getenv('SQL_SERVER');
$database = getenv('SQL_DATABASE');
if ($server === false || $server === '' || $database === false || $database === '') {
    throw new RuntimeException('Set SQL_SERVER and SQL_DATABASE.');
}
$databaseValue = '{' . str_replace('}', '}}', $database) . '}';
$pdo = new PDO(
    "sqlsrv:Server=$server;Database=$databaseValue;Authentication=ActiveDirectoryMsi;"
    . "Encrypt=true;TrustServerCertificate=false;LoginTimeout=30;"
    . "MultipleActiveResultSets=false",
    null,
    null,
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
        PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE => true,
    ]
);

$stmt = null;
try {
    $stmt = $pdo->prepare(
        'SELECT DB_NAME() AS DatabaseName, CAST(1 AS int) AS Connected',
        [PDO::SQLSRV_ATTR_QUERY_TIMEOUT => 30]
    );
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($row !== ['DatabaseName' => $database, 'Connected' => 1]) {
        throw new RuntimeException('Unexpected database or connection result.');
    }
    echo 'Connected to ', $row['DatabaseName'], '.', PHP_EOL;
} finally {
    $stmt = null;
    $pdo = null;
}

Se SQL_DATABASE è appdb, ogni programma stampa:

Connected to appdb.

ActiveDirectoryMsinon utilizza il login locale con interfaccia della riga di comando di Azure. Per lo sviluppo locale o l'integrazione continua (CI), si sceglie un metodo di autenticazione supportato dall'estensione PHP e dal driver ODBC. Puoi ottenere un token di accesso Microsoft Entra tramite una libreria di identità e fornirlo tramite AccessToken. Quando usi un token, ometti nome utente, password e Authentication impostazioni. Imposta AccessToken nell'array delle opzioni di connessione SQLSRV o nel PDO_SQLSRV DSN. Tieni i token fuori dal codice sorgente e dai log. Per ulteriori informazioni, vedere Connettersi utilizzando l'autenticazione Microsoft Entra.

ActiveDirectoryServicePrincipal usa un ID cliente e un segreto cliente; non è un'autenticazione senza password. Se lo usi, leggi il segreto dalla configurazione protetta dell'applicazione. L'autenticazione SQL è un'alternativa solo per i target che la supportano; né il database SQL in Fabric né in Warehouse supportano l'autenticazione SQL.

Adatta l'autenticazione al tuo ambiente

Usa un meccanismo di autenticazione per ogni connessione. Non lasciare un vecchio nome utente, password o Authentication impostazione quando passi a AccessToken.

Environment Configuration Responsabilità
host di Azure con un'identità gestita assegnata al sistema Impostare Authentication su ActiveDirectoryMsi. Non fornire nome utente o password. ODBC ottiene il token dall'endpoint identità dell'host.
Azure host con un'identità gestita assegnata dall'utente Impostare Authentication su ActiveDirectoryMsi. Fornisci l'ID dell'identità tramite l'opzione UID di SQLSRV o l'argomento nome utente di PDO. Non fornire una password. L'ID richiesto dipende dal servizio di hosting. App Service e Istanze di Container utilizzano l'ID client; controlla le indicazioni sull'identità ODBC per altri host.
Workstation o CI con un fornitore esterno di token Ottieni un token per il servizio SQL, poi imposta AccessToken. Ometti nome utente, password e l'impostazione Authentication. La tua applicazione o libreria di identità ottiene e rinnova il token. Nessuna delle due estensioni PHP utilizza automaticamente il login con interfaccia della riga di comando di Azure.
Committente del servizio con un segreto del cliente Impostare Authentication su ActiveDirectoryServicePrincipal. Per SQLSRV, imposta UID sull'ID client e PWD sul segreto. Per PDO, passa l'ID client e il secret come argomenti username e password del costruttore. Proteggi e ruota il secret. Questo metodo non è passwordless.
Accesso SQL su un target che lo supporta SQLSRV utilizza UID/PWD; PDO usa gli argomenti due e tre del costruttore. Il target convalida le credenziali SQL. Questa opzione non si applica a nessuno dei due prodotti Fabric.

Richiedi un token per il servizio SQL, non per la gestione delle risorse Azure. Il audience del token identifica il servizio che lo accetta. Per il cloud pubblico Azure, richiedi alla tua libreria di identità l'ambito https://database.windows.net/.default. Conferma la risorsa appropriata per un altro cloud. Passa il token all'estensione PHP come stringa; non convertirlo manualmente in una struttura ODBC access-token.

Un token può scadere mentre un worker continua a essere in esecuzione. Ottieni un token valido prima di aprire un'altra connessione e aggiorna i token secondo necessità nei processi worker di lunga durata. Non registrare mai un DSN contenente un access token. Per maggiori informazioni sull'autenticazione ODBC, vedi Utilizzo di Microsoft Entra ID con il driver ODBC.

Tieni separati i controlli di crittografia e identità

Encrypt=true richiede un trasporto cifrato. TrustServerCertificate=false richiede la validazione del certificato server, inclusa la sua identità. L'autenticazione Microsoft Entra stabilisce l'identità della tua applicazione; non sostituisce la validazione dei certificati del server.

Utilizzare l'endpoint fornito dal servizio SQL e mantenere l'archivio attendibile dei certificati del sistema operativo client. Non sostituire il nome host con un indirizzo IP per bypassare un problema di risoluzione dei nomi. Per un endpoint privato, correggi la risoluzione del nome e l'instradamento mantenendo il nome atteso della connessione del servizio.

LoginTimeout delimita la creazione della connessione. QueryTimeout per SQLSRV e PDO::SQLSRV_ATTR_QUERY_TIMEOUT per PDO_SQLSRV si applicano all'esecuzione delle istruzioni. Aumentare il timeout della query non risolverà un endpoint di identità gestita mancante o un utente del database errato.

Risoluzione dei problemi per fase di guasto

Fase di guasto Controlli da eseguire
PHP non può caricare l'estensione Conferma la versione runtime, l'architettura, la build di estensione, l'installazione ODBC e il php.ini usato dal processo applicativo.
La connessione al Protocollo di Controllo della Trasmissione (TCP) scade per timeout Verifica l'endpoint e la porta copiati, la risoluzione dei nomi, le regole del firewall, il routing della rete virtuale e la configurazione dell'endpoint privato sull'host PHP.
La convalida del certificato non riesce Controlla il nome dell'endpoint, la catena di certificati e il client trust store. Mantieni attivata la validazione dei certificati.
L'identità gestita non può acquisire un token Conferma che l'identità sia abilitata su questo host e che il suo endpoint identità sia disponibile. Non testare ActiveDirectoryMsi su un laptop normale aspettandoti che l'accesso con interfaccia della riga di comando di Azure sia sufficiente per ActiveDirectoryMsi.
Autenticazione del token non riuscita Controlla il servizio previsto, la scadenza, il tenant e l'identità del token. Conferma l'accesso al database per quell'account. Rimuovi qualsiasi nome utente, password e impostazione Authentication.
L'accesso ha successo ma il database selezionato non riesce ad aprirsi Confermare il nome del database e che il suo amministratore abbia creato o concesso l'accesso all'identità prevista.
Si apre la connessione ma una query dell'applicazione fallisce Controlla i permessi degli oggetti e le funzionalità T-SQL supportate dal target. Il test di connessione non riesce a stabilire l'accesso allo schema applicativo.
Warehouse rifiuta le impostazioni di connessione Imposta MultipleActiveResultSets su false nell'array di opzioni SQLSRV o PDO DSN, e usa l'autenticazione Microsoft Entra.

SQLSRV restituisce false ed espone una raccolta di errori tramite sqlsrv_errors(). Throw PDOExceptiondi costruzione PDO ; gli esempi consentono anche eccezioni per fallimenti di istruzioni. Cattura immediatamente la diagnostica nei log limitati e mantieni gli avvisi SQLSRV distinti dagli errori. Non restituire diagnostiche grezze, token o dettagli di connessione a un browser.

Pianificare le connessioni interrotte

Un servizio può disconnettere una sessione inattiva o interrompere un'operazione durante la manutenzione o il failover. La resilienza delle connessioni inattive ODBC e i tentativi applicativi risolvono diversi problemi. Per le parole chiave di retry e un test di disconnessione controllato, vedi Idle connection resiliency.

Non riprodurre una scrittura solo perché il client ha perso la connessione. Il server potrebbe aver eseguito il commit prima che la risposta venisse persa. Usa una policy di ritenti specifica per l'applicazione e un modo per rilevare il lavoro duplicato. Release statement e gestione delle connessioni quando la richiesta o il lavoro termina, inclusi i percorsi di errore. Per il comportamento del ciclo di vita e del pooling, vedi Connessione al server.