Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Použijte tento článek k instalaci SQLSRV a PDO_SQLSRV ovladačů pro PHP na Windows. Ovladače jsou rozšíření PHP, která používají Microsoft ODBC Driver for SQL Server.
Než začnete, ověřte si, že vaše PHP verze, architektura a režim bezpečnosti vláken jsou podporovány v matici podpory. PHP runtime používaný procesem příkazového řádku a runtime používaný webovým serverem mohou používat různé soubory php.ini. Konfigurujte a ověřujte každý runtime zvlášť.
Na konci procedury by měly být oba ovladače sqlsrv_connect() i ovladač PDO sqlsrv dostupné pro příslušnou CLI nebo webovou aplikaci a každé API by mělo provést testovací dotaz. Úspěšná kopie souboru sama o sobě není dokončená instalace.
Volba metody instalace
| Metoda | Použijte ji, když | Co se nainstaluje |
|---|---|---|
| PHP instalátor rozšíření (PIE) | Chcete, aby instalátor vybral sestavení driveru pro spustitelný soubor PHP | Nepřeverzované php_sqlsrv.dll a php_pdo_sqlsrv.dll, s pokusem o automatickou konfiguraci |
| balíček ZIP k vydání | Musíte si sami vybrat, zkontrolovat nebo nasadit přesné předpřipravené soubory | Verzované DLL vybrané podle vedlejší verze PHP, režimu bezpečnosti vláken a architektury |
Použijte jednu metodu pro obě rozšíření. Nemějte aktivní položky konfigurace PIE a ZIP současně.
Nainstalujte požadované součásti
Nainstalujte podporované sestavení PHP z webu PHP for Windows. Přidejte adresář s PHP do
PATH.Nainstalujte Visual C++ Redistributable požadovaný vaší sestavou PHP. Slaďte jeho architekturu x64 nebo x86 s PHP, jak je popsáno v požadavcích PHP pro Windows.
Nainstalujte nejnovější ovladač Microsoft ODBC pro SQL Server.
Spusťte následující příkazy k ověření prostředí PHP a konfiguračního souboru:
php --version php --iniPokud je Loaded Configuration File
(none), zkopírujtephp.ini-developmentdophp.iniv adresáři PHP.V
php.ini, nastavte adresář rozšíření a povolte rozšíření požadovaná instalátorem PHP pro rozšíření (PIE):extension_dir = "ext" extension=openssl extension=zipOvěřte, že PHP dokáže najít nezbytná rozšíření:
php --ri openssl php --ri zipNejprve splňte tyto předpoklady před stažením PIE.
Instalovat pomocí PIE
PIE nainstaluje odpovídající předkompilovaný driver pro runtime PHP. Na Windows nevyžaduje C kompilátor.
Přepněte do adresáře, do kterého máte oprávnění k zápisu, a stáhněte si nejnovější archiv PIE PHP (PHAR):
curl.exe -fL --output pie.phar https://github.com/php/pie/releases/latest/download/pie.pharZbývající příkazy PIE označují soubor jako
.\pie.phar, takže je spouštějte ze stejného adresáře.Než spustíte PHAR, ověřte si ho pomocí rozhraní příkazového řádku GitHubu (CLI):
gh attestation verify --owner php .\pie.pharPřed pokračováním potvrďte stažení:
dir pie.phar php .\pie.phar --versionNainstalujte každý ovladač zvlášť:
php .\pie.phar install microsoft/sqlsrv php .\pie.phar install microsoft/pdo_sqlsrvOvěřte runtime příkazového řádku:
php --ri sqlsrv php --ri pdo_sqlsrv php -m | findstr /I "sqlsrv pdo_sqlsrv"
PIE se snaží povolit rozšíření v konfiguraci používané spustitelným souborem příkazového řádku. Pokud PIE hlásí, že rozšíření nebylo možné povolit, přidejte položky rozšíření specifické pro PIE.
Pokud váš webový server používá jinou PHP instalaci, nainstalujte oba ovladače pro verzi PHP, architekturu a režim bezpečnosti vláken této instalace před konfigurací. Pokud stejná instalace PHP používá jiný php.ini pro webový server, povolte v tomto souboru nainstalovaná rozšíření. Ověřte webový runtime zvlášť a po změně konfigurace restartujte webový server.
PIE mění vybranou instalaci PHP. Nekonfiguruje IIS, nevybírá web IIS ani nerestartuje stávající PHP procesy.
Ručně nainstalovat vydaný ZIP balíček
Tuto metodu použijte, když potřebujete sami vybrat soubory ovladačů nebo když PIE není vhodné.
Stáhněte si Windows ZIP pro vydanou verzi ovladačů ze stránky Microsoft Drivers for PHP for SQL Server releases.
Spusť
php -i | findstr /I "PHP Version Thread Safety Architecture extension_dir"a zaznamenej verzi PHP, režim bezpečnosti vláken, architekturu a adresář rozšíření.Z ZIP zkopírujte obě odpovídající dynamické knihovny (DLL) do adresáře rozšíření:
php_sqlsrv_<php-version>_<ts-or-nts>_<x86-or-x64>.dll php_pdo_sqlsrv_<php-version>_<ts-or-nts>_<x86-or-x64>.dllNapříklad PHP 8.5 x64 thread-safe runtime používá
php_sqlsrv_85_ts_x64.dllaphp_pdo_sqlsrv_85_ts_x64.dll.Přidejte odpovídající názvy rozšíření k
php.ini, které runtime používá:extension=php_sqlsrv_85_ts_x64.dll extension=php_pdo_sqlsrv_85_ts_x64.dllNahraďte
85,ts, ax64hodnotami pro vaše PHP runtime. Nemíchejte thread-safe a non-thread-safe soubory, 32bitové a 64bitové soubory nebo soubory vytvořené pro jinou podverzi PHP.Ověřte čas běhu pomocí
php --ri sqlsrv,php --ri pdo_sqlsrv, aphp -m. U webového serveru omezte přístup k diagnostické stránce před vytvořením dočasnéphpinfo()stránky. Ověřte načtený konfigurační soubor a obě sekce ovladačů, poté stránku odstraňte.
Nakonfigurujte webový server
Pro IIS nakonfigurujte příslušný modul php-cgi.exe jako aplikaci FastCGI podle pokynů k instalaci PHP pro IIS. Ověřte, že aplikace FastCGI používá stejný PHP adresář a architekturu, jakou jste použili k instalaci ovladačů.
Pro jakýkoli Windows webový server:
Omezte přístup k diagnostické stránce před vytvořením dočasné
phpinfo()stránky. Identifikujte spustitelný soubor PHP a aktivníphp.iniwebového serveru.Ujistěte se, že oba ovladače jsou nainstalovány pro webové runtime. Pro samostatnou instalaci PHP použijte PIE s PHP spustitelným souborem této instalace, nebo zkopírujte obě odpovídající DLL z vydaného ZIP do jeho adresáře rozšíření. Přidejte záznamy ovladačů do konfigurace webového runtime, včetně případů, když se od CLI liší pouze jeho
php.ini.Restartujte webový server nebo procesy FastCGI.
Ujistěte se, že stránka obsahuje samostatné sekce
sqlsrvapdo_sqlsrv.Odstranit stránku
phpinfo().
Otestujte obě PHP API
Uložte tento program jako verify-php-drivers.php:
<?php
$failures = [];
if (!extension_loaded('sqlsrv') || !function_exists('sqlsrv_connect')) {
$failures[] = 'SQLSRV is not available.';
}
if (!extension_loaded('pdo_sqlsrv') || !in_array('sqlsrv', PDO::getAvailableDrivers(), true)) {
$failures[] = 'PDO_SQLSRV is not available.';
}
echo $failures === []
? "SQLSRV and PDO_SQLSRV are available." . PHP_EOL
: implode(PHP_EOL, $failures) . PHP_EOL;
exit($failures === [] ? 0 : 1);
Spusť to nejdřív z příkazového řádku:
php verify-php-drivers.php
Očekávaný výstup:
SQLSRV and PDO_SQLSRV are available.
Pokud potřebujete ověřit webový runtime, umístěte soubor dočasně do kořene dokumentu webu a otevřete jej v prohlížeči. Po testování ho vyjměte. Tento program ověřuje rozhraní PHP API, aniž by vyžadoval nebo zpřístupňoval databázové přihlašovací údaje.
Otestujte připojení k databázi
Načtení rozšíření je jen první kontrolou instalace. Obě API otestujte proti cílové databázi, kterou aplikace používá, takže test zahrnuje také ovladač ODBC, síťovou cestu, šifrování, autentizaci, provádění dotazů, vrácené hodnoty a čištění.
Nastavte dočasné proměnné prostředí v PowerShellu odpovídáním na výzvy. Zadejte název serveru a databáze jako surové hodnoty, bez uvozovek nebo kódování ovladačů. Použijte dialogové okno nebo výzvu k zadání přihlašovacích údajů pro testovací účet, který se může připojit k databázi. Nezahrňujte přihlašovací údaje do příkazové řádky ani zaznamenané terminálové relace:
$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
Výzva k přihlašovacím údajům maskuje heslo. Prostředí obsahuje heslo v otevřeném textu, aby ho PHP mohl číst. Tyto proměnné používejte pouze v testovací relaci, netiskněte je a po testování je vymažte.
Uložte tento program jako test-php-drivers.php. Ponechte hodnoty prostředí beze změny. Program zdvojí zavírací závorky a přidává vnější závorky před předáním názvu databáze, uživatelského jména a hesla ovladači. Toto kódování zachovává složené závorky a zabraňuje tomu, aby středníky oddělovaly možnosti připojení.
<?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);
Spusť program se stejným PHP spustitelným souborem, který jsi ověřil:
php test-php-drivers.php
Očekávaný výstup:
SQLSRV query: 1
PDO_SQLSRV query: 1
Pokud kontrola rozšíření projde, ale tento program selže, použijte SQLSTATE a nativní chybu k identifikaci vlastnící vrstvy. Nepřeinstalujte PHP rozšíření kvůli chybě sítě, certifikátu, ověření nebo oprávnění k databázi.
Odstraňte skript a dočasné proměnné po testování:
Remove-Item .\verify-php-drivers.php, .\test-php-drivers.php
Remove-Item Env:\SQL_SERVER_NAME, Env:\SQL_DATABASE, Env:\SQL_UID, Env:\SQL_PWD
Troubleshooting
| Symptom | Co zkontrolovat | Opravit |
|---|---|---|
Could not open input file: .\pie.phar |
Aktuální adresář a místo stahování | Vraťte se do adresáře obsahujícího ověřený PHAR, nebo si ho stáhněte a ověřte znovu |
Unable to load dynamic library |
extension_dir, přesný název DLL, minor verze PHP, architektura a režim bezpečnosti vláken |
Vyberte odpovídající DLL nebo znovu spusťte PIE s zamýšleným PHP spustitelným souborem |
The specified module could not be found |
Závislosti DLL ovladače | Ověřte, že soubor DLL rozšíření existuje, nainstalujte odpovídající Visual C++ Redistributable a zkontrolujte případnou zbývající chybějící závislost DLL |
| CLI načítá oba ovladače, ale IIS ne | Jiný spustitelný soubor PHP nebo php.ini |
Porovnejte phpinfo() s php --ini, nakonfigurujte runtime IIS a restartujte FastCGI |
Module "sqlsrv" is already loaded |
Jak PIE zápisy, tak i ZIP, nebo opakované zápisy | Ponechte jeden záznam SQLSRV a jeden záznam PDO_SQLSRV |
Sestavy PDO could not find driver |
Konfigurace PDO_SQLSRV | Spusťte php --ri pdo_sqlsrv a zkontrolujte PDO::getAvailableDrivers() |
| PIE hlásí úspěch, ale stará verze zůstává | Verzované ZIP záznamy jsou stále aktivní | Nahraďte staré záznamy neverzovanými DLL záznamy PIE a restartujte všechny procesy PHP |
Pokud se obě rozšíření načtou, PHP může volat jejich API. Zachyťte chyby SQLSRV nebo výjimku PDO před změnou ovladačových souborů. Chyby v síti, autentizaci, šifrování, certifikátech a oprávněních databáze nejsou opraveny přeinstalací rozšíření PHP.