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.
Zde jsou důležité body týkající se sdružování připojení v Microsoft Drivers 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 Linuxu a macOS jsou připojení sdružována pouze, pokud je pro rozhraní ODBC povoleno sdružování připojení (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 je atribut ConnectionPooling vynechán z připojovacího řetězce nebo pokud je nastaven na hodnotu true (nebo 1), ovladač vytvoří pouze nové připojení, pokud v 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ásledujících dotazech.
V případě potřeby zkontrolujte, jak zakázat 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 nelze 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>
Soubor odbcinst.ini by měl vypadat minimálně takto:
[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číst 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.
<?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);
}
?>