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.
Následující body jsou důležité pro sdružování připojení v ovladačích Microsoft pro PHP pro SQL Server:
Ovladače Microsoftu pro PHP pro SQL Server používají sdružování připojení ODBC.
Ve výchozím nastavení je ve Windows povolené sdružování připojení. V systémech Linux a macOS se připojení sdružují pouze tehdy, pokud je povoleno sdružování připojení pro ODBC (viz Povolení nebo zakázání sdružování připojení). Pokud je povolené sdružování připojení a připojíte se k serveru, ovladač se pokusí použít připojení ve fondu předtím, než vytvoří nové připojení. Pokud se ve fondu nenajde ekvivalentní připojení, vytvoří se nové připojení a přidá se do fondu. Ovladač určuje, jestli jsou připojení ekvivalentní na základě porovnání připojovacích řetězců.
Když se použije připojení z fondu, stav připojení se resetuje (jenom Windows).
Zavření připojení vrátí připojení k fondu.
Další informace o sdružování připojení naleznete v tématu Sdružování připojení Správce ovladačů.
Povolení nebo zakázání sdružování připojení
Windows
Ovladač můžete vynutit, aby vytvořil nové připojení (místo vyhledání ekvivalentního připojení ve fondu připojení) nastavením hodnoty atributu ConnectionPooling v připojovacím řetězci na false (nebo 0).
Pokud se atribut ConnectionPooling vynechá z připojovací řetězec nebo pokud je nastavený na true (nebo 1), ovladač vytvoří nové připojení pouze v případě, že ve fondu připojení neexistuje ekvivalentní připojení.
Poznámka:
Ve výchozím nastavení je povoleno více aktivních sad výsledků (MARS). Pokud se používá MARS i sdružování, aby služba MARS fungovala správně, vyžaduje ovladač delší dobu, než resetuje připojení v prvním dotazu, a proto ignoruje zadaný časový limit dotazu. Nastavení časového limitu dotazu se ale projeví v následných dotazech.
V případě potřeby viz návod k zakázání více aktivních sad výsledků (MARS). Informace o dalších atributech připojení naleznete v tématu Možnosti připojení.
Linux a macOS
Atribut ConnectionPooling nejde použít k povolení nebo zakázání sdružování připojení.
Sdružování připojení je možné povolit nebo zakázat úpravou konfiguračního souboru odbcinst.ini. Ovladač by se měl znovu načíst, aby se změny projevily.
Nastavení Pooling na Yes a kladné hodnoty CPTimeout v souboru odbcinst.ini umožňuje sdružování připojení.
[ODBC]
Pooling=Yes
[ODBC Driver 17 for SQL Server]
CPTimeout=<int value>
Minimálně by soubor odbcinst.ini měl vypadat jako v následujícím příkladu:
[ODBC]
Pooling=Yes
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.2.1
UsageCount=1
CPTimeout=120
Nastavení Pooling na No v souboru odbcinst.ini nutí ovladač vytvořit nové připojení.
[ODBC]
Pooling=No
Poznámky
V Linuxu nebo macOS se sdružování připojení nedoporučuje u unixODBC < 2.3.7. Všechna připojení budou sdružována, pokud je v souboru odbcinst.ini povolené sdružování, což znamená, že možnost připojení ConnectionPooling nemá žádný vliv. Pokud chcete sdružování zakázat, nastavte v souboru odbcinst.ini hodnotu Pooling=Ne a ovladače znovu načtěte.
- UnixODBC <= 2.3.4 (Linux a macOS) nemusí vracet správné diagnostické informace, jako jsou chybové zprávy, upozornění a informativní zprávy.
- Z tohoto důvodu nemusí být ovladače SQLSRV a PDO_SQLSRV schopny správně načítat dlouhá data (například xml, binární) jako řetězce. Dlouhá data se dají načíst jako datové proudy jako alternativní řešení. Podívejte se na následující příklad pro SQLSRV.
Při použití
AccessTokense sdružováním připojení ovladač připojí ke klíčovémuAPPslovu připojení hash hodnotu obsahu tokenu, aby se zajistilo, že připojení s různými přístupovými tokeny se nesdružují. To zabraňuje křížové kontaminaci identity, kdy připojení ve fondu ověřené jako jedna identita může být znovu použito pro jinou identitu. Tokenová data se ukládají do mezipaměti a mají jednoznačnou dobu platnosti (TTL), aby byla zajištěna stabilita ukazatele pro ovladač ODBC. Toto chování bylo zavedeno ve verzi 5.13.1.
<?php
$connectionInfo = array("Database"=>"test", "UID"=>"username", "PWD"=>"password");
$conn1 = sqlsrv_connect("servername", $connectionInfo);
$longSample = str_repeat("a", 8500);
$xml1 =
'<ParentXMLTag>
<ChildTag01>'.$longSample.'</ChildTag01>
</ParentXMLTag>';
// Create table and insert xml string into it
sqlsrv_query($conn1, "CREATE TABLE xml_table (field xml)");
sqlsrv_query($conn1, "INSERT into xml_table values ('$xml1')");
// retrieve the inserted xml
$column1 = getColumn($conn1);
// return the connection to the pool
sqlsrv_close($conn1);
// This connection is from the pool
$conn2 = sqlsrv_connect("servername", $connectionInfo);
$column2 = getColumn($conn2);
sqlsrv_query($conn2, "DROP TABLE xml_table");
sqlsrv_close($conn2);
function getColumn($conn)
{
$tsql = "SELECT * from xml_table";
$stmt = sqlsrv_query($conn, $tsql);
sqlsrv_fetch($stmt);
// This might fail in Linux and macOS
// $column = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
// The workaround is to fetch it as a stream
$column = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR));
sqlsrv_free_stmt($stmt);
return ($column);
}
?>