Sdílet prostřednictvím


Sdružování připojení (ovladače Microsoftu pro PHP pro SQL Server)

Stáhnout ovladač PHP

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);
}
?>

Viz také

Postupy: Připojení pomocí ověřování systému Windows

Postupy: Připojení pomocí ověřování SQL Serveru