Verbindungspooling (Microsoft Drivers for PHP for SQL Server)

PHP-Treiber herunterladen

Die folgenden Punkte sind wichtig zum Verbindungspooling bei den Microsoft-Treibern für PHP-SQL-Server:

  • Microsoft-Treiber für PHP für SQL Server verwendet ODBC-Verbindungspooling.

  • Das Verbindungspooling ist in Windows standardmäßig aktiviert. In Linux und macOS werden Verbindungen nur zusammengefasst, wenn verbindungspooling für ODBC aktiviert ist (siehe Aktivieren oder Deaktivieren der Verbindungspooling). Wenn Verbindungspooling aktiviert ist und Sie eine Verbindung mit einem Server herstellen, versucht der Treiber zunächst, eine Poolverbindung zu verwenden, bevor er eine neue erstellt. Wenn eine entsprechende Verbindung im Pool nicht gefunden wird, wird eine neue Verbindung erstellt und dem Pool hinzugefügt. Basierend auf einem Vergleich der Verbindungszeichenfolgen, ermittelt der Treiber ob die Verbindungen äquivalent sind.

  • Wenn eine Verbindung aus dem Pool verwendet wird, wird der Verbindungsstatus zurückgesetzt (nur Windows).

  • Das Schließen der Verbindung gibt die Verbindung an den Pool zurück.

Weitere Informationen zum Verbindungspooling finden Sie unter Driver Manager-Verbindungspooling.

Aktivieren/Deaktivieren von Verbindungspooling

Windows

Sie können den Treiber zwingen, eine neue Verbindung zu erstellen (anstatt nach einer äquivalenten Verbindung im Verbindungspool zu suchen), indem Sie den Wert des ConnectionPooling-Attributs in der Verbindungszeichenfolge auf false (oder 0) festlegen.

Wenn das Attribut ConnectionPooling aus dem Verbindungszeichenfolge weggelassen wird oder wenn es auf true (oder 1) festgelegt ist, erstellt der Treiber nur eine neue Verbindung, wenn keine entsprechende Verbindung im Verbindungspool vorhanden ist.

Hinweis

MARS (mehrere aktive Resultsets) ist standardmäßig aktiviert. Wenn sowohl MARS als auch Pooling verwendet werden, benötigt der Treiber mehr Zeit, um die Verbindung bei der ersten Abfrage zurückzusetzen, damit MARS korrekt funktioniert. Daher werden alle angegebenen Abfragetimeouts ignoriert. Die Abfragetimeouteinstellung wird jedoch in nachfolgenden Abfragen wirksam.

Falls erforderlich, lesen Sie How to: Disable Multiple Active Resultsets (MARS). Weitere Informationen zu weiteren Verbindungsattributen finden Sie unter Connection Options.

Linux und macOS

Das ConnectionPooling-Attribut kann nicht zum Aktivieren oder Deaktivieren der Verbindungspooling verwendet werden.

Die Verbindungspooling kann durch Bearbeiten der odbcinst.ini Konfigurationsdatei aktiviert oder deaktiviert werden. Der Treiber sollte erneut geladen werden, damit die Änderungen wirksam werden.

Wenn Sie Pooling auf Yes und einen positiven CPTimeout-Wert in der Datei „odbcinst.ini“ festlegen, wird das Verbindungspooling ermöglicht.

[ODBC]
Pooling=Yes

[ODBC Driver 17 for SQL Server]
CPTimeout=<int value>

Die odbcinst.ini Datei sollte mindestens wie im folgenden Beispiel aussehen:

[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

Wenn Sie in der Datei „odbcinst.ini“ Pooling auf No festlegen, wird der Treiber gezwungen, eine neue Verbindung herzustellen.

[ODBC]
Pooling=No

Bemerkungen

  • Unter Linux oder macOS wird das Verbindungspooling mit unixODBC < 2.3.7 nicht empfohlen. Alle Verbindungen werden gepoolt, wenn Pooling in der Datei „odbcinst.ini“ aktiviert ist, was bedeutet, dass die Verbindungsoption „ConnectionPooling“ keine Wirkung hat. Um das Pooling zu deaktivieren, legen Sie in der Datei „odbcinst.ini“ „Pooling=No“ fest, und laden Sie die Treiber erneut.

    • unixODBC <= 2.3.4 (Linux und macOS) gibt möglicherweise keine ordnungsgemäßen Diagnoseinformationen zurück, z. B. Fehlermeldungen, Warnungen und informative Nachrichten.
    • Aus diesem Grund können SQLSRV- und PDO_SQLSRV-Treiber möglicherweise keine langen Daten (z. B. XML, Binärdatei) als Zeichenfolgen ordnungsgemäß abrufen. Lange Daten können zur Problemumgehung als Datenströme abgerufen werden. Sehen Sie sich das folgende Beispiel für SQLSRV an.
  • Bei Verwendung AccessToken mit Verbindungspooling fügt der Treiber einen Hash des Tokeninhalts an das APP Verbindungsstichwort an, um sicherzustellen, dass Verbindungen mit unterschiedlichen Zugriffstoken nicht zusammengepoolt werden. Dadurch wird eine Identitätsübergreifende Kontamination verhindert, bei der eine als eine Identität authentifizierte Poolverbindung für eine andere Identität wiederverwendet werden kann. Tokendaten werden mit TTL-basiertem Ablauf zwischengespeichert, um die Zeigerstabilität für den ODBC-Treiber sicherzustellen. Dieses Verhalten wurde in Version 5.13.1 eingeführt.

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