Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Upgrade SQLSRV en PDO_SQLSRV samen zodat beide extensies dezelfde releasefamilie gebruiken. De PHP-drivers gebruiken de Microsoft ODBC Driver voor SQL Server, dus controleer de systeemvereisten voordat je upgradet.
Een upgrade verandert native code die in PHP-processen wordt geladen. Een gemengde implementatie kan de vorige release blijven draaien, falen bij het opstarten van PHP, of verschillende driverversies beschikbaar stellen aan de CLI en webapplicatie. Inventariseer elke PHP-runtime en bewaar de vorige bestanden en configuraties totdat de verificatie is afgerond.
Kies het upgradepad
| Huidige installatie | Doelinstallatiepad | Procedure |
|---|---|---|
| PIE | PIE | Voer PIE uit met hetzelfde PHP-uitvoerbare bestand of expliciet php-config, en verifieer vervolgens elke SAPI |
| Windows heeft ZIP uitgebracht | Door Windows gemaakte ZIP | Vervang beide DLL's met versienummer en werk beide configuratie-items tegelijk bij |
| Windows Released ZIP | PIE | Installeer beide PIE-pakketten, vervang DLL-vermeldingen met versienummer door PIE-vermeldingen en verwijder duplicaten |
| archief voor Linux of macOS | PIE | Installeer beide PIE-pakketten, vervang archiefbestandsnaam-entries door sqlsrv.so en pdo_sqlsrv.so, en behoud de PDO-laadvolgorde |
| Linux of macOS PIE | Nieuwe PHP minor versie | Installeer de nieuwe PHP-ontwikkeltools, bouw beide extensies voor die PHP-installatie en configureer elke SAPI afzonderlijk |
Overschrijf de vorige binaries niet totdat je een rollback-kopie hebt. Upgrade niet slechts één extensie als de applicatie beide API's gebruikt.
Voordat u een upgrade uitvoert
Noteer het PHP-uitvoerbare bestand, configuratiebestand, architectuur, thread-safety-modus en huidige driverversies.
php --version php --ini php --ri sqlsrv php --ri pdo_sqlsrvMaak een back-up van het
php.inibestand en eventuele extensie-specifieke.inibestanden diesqlsrvofpdo_sqlsrvladen.Controleer de ondersteuningsmatrix voor de beoogde PHP-versie en het besturingssysteem.
Bekijk de ODBC-compatibiliteitstabel in Systeemvereisten. Installeer een ondersteunde ODBC-versie vóór of tijdens de PHP-driver-upgrade wanneer de beoogde driverrelease dat vereist.
Plan een herstart van elk proces dat PHP laadt, inclusief de webserver, PHP FastCGI Process Manager (PHP-FPM), wachtrijwerkers en langlopende commandoregelwerkers.
Noteer een baseline van elke runtime:
- De
ExtensionVerdie wordt getoond doorphp --ri sqlsrvenphp --ri pdo_sqlsrv. - Het configuratiebestand en de map
.inizijn geladen en gescand. - De extensiedirectory en de bestandsnamen van actieve stuurprogramma's.
- Een geslaagde applicatie-rooktest die elke API gebruikt waarvan jouw applicatie afhankelijk is.
- De
Bereid een rollback voor:
- Houd de vorige PHP-runtime beschikbaar als je de PHP-minor versie verandert. Noteer het uitvoerbare bestand dat voor elke webserver en worker is geconfigureerd.
- Bewaar kopieën van de vorige SQLSRV- en PDO_SQLSRV bestanden.
- Bewaar kopieën van elk gewijzigd
php.iniof extensie-specifiek.inibestand. - Noteer de vorige ODBC-pakketversie als de upgrade deze verandert.
- Definieer hoe u verkeer of workers kunt stoppen terwijl native extensiebestanden worden vervangen.
Upgrade in Windows met PIE
Gebruik de PHP Installer for Extensions (PIE) met het PHP-uitvoerbare bestand dat de applicatie bedient. Eerst download en verifieer PIE. Voordat je een van beide installatiecommando's uitvoert, leid je het applicatieverkeer om en stop je de webserver, FastCGI-processen en workers die deze PHP-installatie gebruiken. Voorkom dat ze automatisch opnieuw opstarten totdat zowel extensies als hun configuratie klaar zijn. Houd een aparte commandoregelsessie voor PIE.
Schakel de bestaande SQLSRV- en PDO_SQLSRV-extensie-entries in de CLI-configuratie die door PIE wordt gebruikt tijdelijk uit door ze uit te commentariëren. Anders kan het PHP-proces waarin PIE draait de oude DLL's geladen houden en vervanging voorkomen. Houd de vereiste extensies van PIE ingeschakeld.
Vanuit de map met pie.phar installeer je beide pakketten apart:
php .\pie.phar install microsoft/sqlsrv
php .\pie.phar install microsoft/pdo_sqlsrv
PIE installeert php_sqlsrv.dll en php_pdo_sqlsrv.dll. In elke actieve configuratie vervang ZIP-items met versie zoals extension=php_sqlsrv_85_ts_x64.dll en extension=php_pdo_sqlsrv_85_ts_x64.dll door:
extension=php_sqlsrv.dll
extension=php_pdo_sqlsrv.dll
Schakel beide vermeldingen in en verwijder dubbele SQLSRV- en PDO_SQLSRV-items, zelfs als PIE meldt dat automatische inschakeling is geslaagd. Als de webserver een andere PHP-installatie gebruikt, herhaal dan de upgrade en configuratiewijzigingen voor die installatie.
Start elk PHP-proces opnieuw op en voer vervolgens php --ri sqlsrv en php --ri pdo_sqlsrv uit met het bijbehorende uitvoerbare bestand. Bevestig dat ExtensionVer de beoogde versie voor beide stuurprogramma’s rapporteert. Voor een webapplicatie, beperk de toegang tot diagnostische pagina's voordat een tijdelijke phpinfo() pagina wordt aangemaakt. Controleer beide waarden en verwijder dan de pagina.
Upgrade een Windows ZIP-installatie
Download de Windows ZIP van de beoogde release vanaf de pagina Microsoft Drivers for PHP for SQL Server releases.
Bevestig dat de nieuwe namen van de dynamic-link library (DLL) overeenkomen met de PHP-minorversie, architectuur en thread-safety-modus. Stop de PHP-webserver of workerprocessen voordat je bestanden vervangt.
Vervang de bestanden
php_sqlsrv_*.dllenphp_pdo_sqlsrv_*.dllin de PHP-extensiemap. Behoud de bestaandeextension=vermeldingen als de bestandsnamen nog overeenkomen. Anders, update ze samen.Installeer of upgrade de Microsoft ODBC-driver voor SQL Server als de doel-PHP-driver een nieuwere ondersteunde versie vereist.
Herstart elk PHP-proces dat de vervangen DLL's gebruikt opnieuw. Een lopend proces houdt de oude native extensie geladen totdat deze afsluit.
Upgrade op Linux of macOS met PIE
Volg de PIE-setup en platformvereisten als PIE niet geïnstalleerd is. Bevestig dat de PHP-ontwikkeltools en het ODBC-ontwikkelpakket zijn geïnstalleerd. In een interactieve sessie kan PIE via de platformpakketbeheerder vragen om ontbrekende buildtools te installeren. In een niet-interactieve sessie installeer je ze voordat je PIE uitvoert.
Selecteer de PHP-installatie voordat je upgradet. Voor een geversioneerde installatie voeg je PIE's
--with-php-configoptie toe aan beide installatiecommando's. Gebruik bijvoorbeeldpie install --with-php-config=/usr/bin/php-config8.4 microsoft/sqlsrvwanneer/usr/bin/php-config8.4het bedoelde configuratiehulpmiddel is. Pas dezelfde optie toe opmicrosoft/pdo_sqlsrv. Voor de geversioneerde uitvoerbare bestanden van Alpine gebruik je de installatiecommando's van Alpine.Leid het applicatieverkeer weg en stop de webserver, PHP-FPM processen en workers die deze PHP-installatie gebruiken. Voorkom dat ze automatisch opnieuw opstarten totdat zowel extensies als hun configuratie klaar zijn. Houd een aparte commandoregelsessie voor PIE.
Schakel de bestaande SQLSRV- en PDO_SQLSRV-extensie-entries in de CLI-configuratie die door PIE wordt gebruikt tijdelijk uit door ze uit te commentariëren. Houd de vereiste extensies van PIE ingeschakeld.
Werk beide pakketten apart bij. Deze commando's gebruiken de standaard PHP-installatie van PIE:
pie install microsoft/sqlsrv pie install microsoft/pdo_sqlsrvControleer elke actieve configuratie van de PHP-installatie die door jouw applicatie wordt gebruikt. Als een eerdere handmatige installatie archiefbestandsnamen zoals
extension=SQLSRV_8.4_NTS.soenextension=PDO_SQLSRV_8.4_NTS.sogebruikt, vervang dan die vermeldingen door de door PIE geïnstalleerde bestandsnamen:extension=sqlsrv.so extension=pdo_sqlsrv.soActiveer beide driververmeldingen opnieuw en verwijder duplicaten. Bewaar PDO_SQLSRV in een gescand configuratiebestand dat na PDO wordt geladen, zoals beschreven in Load the drivers on Linux en macOS. Herhaal deze configuratiewijziging voor de commandoregel-, PHP-FPM-, webserver- en workerconfiguraties die je applicatie gebruikt.
Upgrade de Microsoft ODBC-driver voor SQL Server wanneer vereist door de doelrelease.
Herstart elke CLI-worker, queue-worker, webserver en PHP-FPM-service die de geüpgradede PHP-installatie gebruiken.
Herstart en controleer
Het vervangen van een extensiebestand werkt een PHP-proces dat al de oude binary heeft geladen niet bij. Herstart de webserver, PHP-FPM en eventuele langlopende PHP-workers voordat je de upgrade verifieert.
Controleer de runtime van de commandoregel:
php --ri sqlsrv php --ri pdo_sqlsrv php -m | findstr /I "sqlsrv pdo_sqlsrv"Op Linux of macOS vervang je het laatste commando door
php -m | grep -E 'sqlsrv|pdo_sqlsrv'.Voor een webapplicatie, beperk de toegang tot diagnostische pagina's voordat een tijdelijke
phpinfo()pagina wordt aangemaakt. Controleer het geladen configuratiebestand, de extensiemap enExtensionVervoor beide drivers. Bevestig dat datExtensionVerde doelversie rapporteert en verwijder dan de pagina.Voer een bestaande applicatie-rooktest uit die zowel SQLSRV als PDO_SQLSRV gebruikt als je applicatie beide gebruikt. Laat de verbindingsconfiguratie ongewijzigd tijdens deze controle, zodat een upgradetest niet ook een niet-gerelateerde verbindingswijziging test.
Als een driver niet laadt, vergelijk dan de PHP minor-versie, architectuur, thread-safety-modus, extensiemap en ODBC-installatie met de waarden die vóór de upgrade zijn geregistreerd.
Controleer zowel API's als versies
Sla dit programma op als verify-driver-upgrade.php:
<?php
$results = [
'SQLSRV' => [
'loaded' => extension_loaded('sqlsrv') && function_exists('sqlsrv_connect'),
'version' => phpversion('sqlsrv'),
],
'PDO_SQLSRV' => [
'loaded' => extension_loaded('pdo_sqlsrv')
&& in_array('sqlsrv', PDO::getAvailableDrivers(), true),
'version' => phpversion('pdo_sqlsrv'),
],
];
$failed = false;
foreach ($results as $name => $result) {
$version = $result['version'] === false ? 'unknown' : $result['version'];
echo "$name: " . ($result['loaded'] ? 'loaded' : 'missing') . ", version $version" . PHP_EOL;
$failed = $failed || !$result['loaded'] || $result['version'] === false;
}
exit($failed ? 1 : 0);
Voer het programma uit met het CLI-uitvoerbare bestand en, tijdelijk, via elke webruntime. Bevestig dat beide gerapporteerde versies overeenkomen met de release die je hebt geïnstalleerd. Verwijder de webkopie na verificatie.
Dit programma verifieert de PHP-extensielaag. Voer daarna de rooktest van de ongewijzigde applicatie uit om ODBC-laden, verbindingsopties, authenticatie, databasetoegang, teruggegeven PHP-types en opruimgedrag te verifiëren.
Controleer het gedrag van de database vóór en na de upgrade
Gebruik hetzelfde programma en dezelfde verbindingsinstellingen voor en na de upgrade. Het ongewijzigd houden van de test scheidt stuurprogrammawijzigingen van applicatie- of verbindingsconfiguratiewijzigingen.
Stel de omgevingsvariabelen SQL_SERVER_NAME, SQL_DATABASE, SQL_UID en SQL_PWD in voor een testaccount door prompts te beantwoorden. Voer de ruwe waarden in, zonder shell-quotes of drivercodering. Voeg geen inloggegevens toe in een commandoregel of opgenomen terminalsessie.
Voer in Windows PowerShell de servernaam en databasenaam in, en gebruik vervolgens het inloggegevensvenster of de prompt voor het testaccount:
$env:SQL_SERVER_NAME = Read-Host "Server name (tcp:<server>,1433)"
$env:SQL_DATABASE = Read-Host "Database name"
$credential = Get-Credential -Message "Enter the database test account"
if ($null -eq $credential) {
throw "Database test credentials are required."
}
$env:SQL_UID = $credential.UserName
$env:SQL_PWD = $credential.GetNetworkCredential().Password
Remove-Variable credential
Gebruik Bash op Linux of macOS. Schakel command tracing uit voordat u eventuele waarden leest. De wachtwoordprompt toont je invoer niet:
set +x
IFS= read -r -p 'Server name (tcp:<server>,1433): ' SQL_SERVER_NAME
IFS= read -r -p 'Database name: ' SQL_DATABASE
IFS= read -r -p 'User name: ' SQL_UID
IFS= read -r -s -p 'Password: ' SQL_PWD
printf '\n'
export SQL_SERVER_NAME SQL_DATABASE SQL_UID SQL_PWD
De omgeving bevat het platte tekstwachtwoord zodat PHP het kan lezen. Gebruik deze variabelen alleen tijdens de testsessie, print ze niet uit en maak ze na het testen schoon.
Sla dit programma op als test-driver-upgrade.php. Houd de omgevingswaarden ongewijzigd. Het programma verdubbelt sluitaccolades en voegt buitenste beugels toe voordat de databasenaam, gebruikersnaam en wachtwoord aan het stuurprogramma worden doorgegeven. Deze codering behoudt letterlijke accolades en voorkomt dat puntkomma's verbindingsopties scheiden.
<?php
$serverName = getenv('SQL_SERVER_NAME');
$database = getenv('SQL_DATABASE');
$uid = getenv('SQL_UID');
$pwd = getenv('SQL_PWD');
if ($serverName === false || $serverName === ''
|| $database === false || $database === ''
|| $uid === false || $uid === ''
|| $pwd === false || $pwd === '') {
fwrite(STDERR, "Set SQL_SERVER_NAME, SQL_DATABASE, SQL_UID, and SQL_PWD." . PHP_EOL);
exit(1);
}
$database = '{' . str_replace('}', '}}', $database) . '}';
$uid = '{' . str_replace('}', '}}', $uid) . '}';
$pwd = '{' . str_replace('}', '}}', $pwd) . '}';
$connectionOptions = [
"Database" => $database,
"UID" => $uid,
"PWD" => $pwd,
"Encrypt" => 1,
"TrustServerCertificate" => 0,
];
$sqlsrvConnection = sqlsrv_connect($serverName, $connectionOptions);
if ($sqlsrvConnection === false) {
foreach (sqlsrv_errors() as $error) {
fwrite(
STDERR,
"SQLSRV {$error['SQLSTATE']} ({$error['code']}): {$error['message']}" . PHP_EOL
);
}
exit(1);
}
$sqlsrvStatement = sqlsrv_query($sqlsrvConnection, "SELECT 1 AS TEST_VALUE");
if ($sqlsrvStatement === false) {
foreach (sqlsrv_errors() as $error) {
fwrite(
STDERR,
"SQLSRV {$error['SQLSTATE']} ({$error['code']}): {$error['message']}" . PHP_EOL
);
}
sqlsrv_close($sqlsrvConnection);
exit(1);
}
$sqlsrvRow = sqlsrv_fetch_array($sqlsrvStatement, SQLSRV_FETCH_ASSOC);
if ($sqlsrvRow === false || $sqlsrvRow === null || (int) $sqlsrvRow['TEST_VALUE'] !== 1) {
fwrite(STDERR, "SQLSRV returned an unexpected result." . PHP_EOL);
sqlsrv_free_stmt($sqlsrvStatement);
sqlsrv_close($sqlsrvConnection);
exit(1);
}
echo "SQLSRV query: 1" . PHP_EOL;
sqlsrv_free_stmt($sqlsrvStatement);
sqlsrv_close($sqlsrvConnection);
$failed = false;
try {
$pdoConnection = new PDO(
"sqlsrv:server=$serverName;Database=$database;Encrypt=1;TrustServerCertificate=0",
$uid,
$pwd,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$pdoStatement = $pdoConnection->query("SELECT 1 AS TEST_VALUE");
$pdoRow = $pdoStatement->fetch(PDO::FETCH_ASSOC);
if ($pdoRow === false || (int) $pdoRow['TEST_VALUE'] !== 1) {
throw new RuntimeException("PDO_SQLSRV returned an unexpected result.");
}
echo "PDO_SQLSRV query: 1" . PHP_EOL;
} catch (Throwable $exception) {
fwrite(STDERR, $exception->getMessage() . PHP_EOL);
$failed = true;
} finally {
unset($pdoStatement);
unset($pdoConnection);
}
exit($failed ? 1 : 0);
Voer het programma uit vóór de upgrade en sla de succesvolle output op. Voer het ongewijzigde bestand opnieuw uit nadat je elk PHP-proces hebt herstart:
php test-driver-upgrade.php
Beide uitvoeringen moeten opleveren:
SQLSRV query: 1
PDO_SQLSRV query: 1
Als de post-upgrade uitvoering mislukt, behoud dan de exacte SQLSTATE of uitzondering. Vergelijk vervolgens de fout met de basislijn, extensieversies, actieve configuratie, ODBC-versie en de status van het herstarten van het proces. Rol beide PHP-extensies tegelijk terug als je de mismatch binnen het deploymentvenster niet kunt corrigeren.
Na verificatie verwijder je het testbestand en wis je de tijdelijke omgevingsvariabelen. Voer in PowerShell het volgende uit:
Remove-Item .\verify-driver-upgrade.php, .\test-driver-upgrade.php
Remove-Item Env:\SQL_SERVER_NAME, Env:\SQL_DATABASE, Env:\SQL_UID, Env:\SQL_PWD
Voer in Linux of macOS het volgende uit:
rm verify-driver-upgrade.php test-driver-upgrade.php
unset SQL_SERVER_NAME SQL_DATABASE SQL_UID SQL_PWD
Draai een mislukte upgrade terug
Stop de getroffen webservers, PHP-FPM-pools en langlopende workerprocessen.
Als je de PHP-minorversie hebt veranderd, herstel dan de vorige PHP-runtime en wijs elke webserver en worker terug naar die installatie.
Herstel beide eerdere driverbestanden. Herstel samen de vorige SQLSRV- en PDO_SQLSRV configuratie-items.
Herstel het vorige ODBC-pakket alleen als de nieuwere versie de fout heeft veroorzaakt en het oudere pakket nog steeds wordt ondersteund door de PHP-driverversie die je hebt hersteld.
Herstart de processen en voer de basisversiecontroles en applicatie-smoketests opnieuw uit.
Houd de mislukte upgradelogs en de exacte PHP-opstart- of verbindingsfout bij. Ze helpen bepalen of de storing ligt bij het laden van PHP, de besturingssysteemloader, ODBC of de databaseverbinding.
Problemen met een upgrade oplossen
| Symptom | Waarschijnlijke oorzaak | Corrigerende actie |
|---|---|---|
PIE slaagt, maar ExtensionVer blijft ongewijzigd |
Een oude geversioneerde invoer laadt nog steeds het vorige bestand | Vervang de oude post, verwijder duplicaten en start alle PHP-processen opnieuw |
| SQLSRV en PDO_SQLSRV rapporteren verschillende versies | Slechts één extensie is vervangen of één SAPI heeft een verouderde configuratie | Upgrade en configureer beide extensies samen in elke runtime |
| De CLI rapporteert de doelversie, maar de website doet dat niet | De web-SAPI gebruikt een andere PHP-installatie of is niet opnieuw opgestart | Vergelijk configuratie- en extensiemappen en start dan het juiste proces opnieuw |
| PHP-opstart meldt een architectuur- of symboolfout | De extensie komt niet overeen met de PHP-build | Herstel de vorige bestanden, bouw vervolgens bestanden opnieuw op of selecteer ze voor de juiste PHP-minorversie, architectuur en thread-veiligheidsmodus |
| Extensies laden maar verbindingen mislukken na een ODBC-wijziging | ODBC-configuratie, certificaatgedrag, authenticatie of netwerktoegang is gewijzigd | Leg de SQLSTATE en de native fout vast voordat je terugrolt of de verbindingsinstellingen verandert |
| Workerprocessen falen terwijl nieuwe webverzoeken slagen | Langlopende workers behouden nog steeds de vorige extensie of configuratie | Laat elk werkproces leeglopen en start het opnieuw |