Start · Sprachen · PHP · Referenz · mqseries_disc

mqseries_disc

Funktion

Trennt die Verbindung zu einem IBM MQ Queue-Manager (entspricht dem MQDISC-Aufruf der MQ-API).

Kategorie: misc

Signatur

mqseries_disc(resource $hconn, resource &$compCode, resource &$reason): void

Beschreibung

mqseries_disc schließt eine zuvor mit mqseries_conn oder mqseries_connx geöffnete Verbindung zu einem IBM MQ (früher WebSphere MQ / MQSeries) Queue-Manager. Der Aufruf entspricht dem nativen MQDISC-Aufruf der MQ C-API.

Nach dem Aufruf ist der übergebene Verbindungs-Handle $hconn ungültig. Alle noch geöffneten Queues oder anderen Objekte, die über diesen Handle geöffnet wurden, sollten zuvor explizit mit mqseries_close geschlossen werden, um Ressourcenlecks zu vermeiden.

Der Erfolg oder Misserfolg des Aufrufs wird über die Ausgabeparameter $compCode (Completion Code) und $reason (Reason Code) signalisiert. Ein $compCode von MQCC_OK (0) zeigt Erfolg an; bei einem Fehler liefert $reason den IBM-MQ-spezifischen Fehlercode, der mit mqseries_strerror in einen lesbaren Text umgewandelt werden kann.

Diese Funktion ist Teil der mqseries-Erweiterung für PHP und setzt eine korrekt installierte und konfigurierte IBM MQ Client-Bibliothek voraus.

Parameter

Name Typ Default Beschreibung
$hconn Pflicht resource Der Verbindungs-Handle zum Queue-Manager, der zuvor durch mqseries_conn oder mqseries_connx erzeugt wurde.
$compCode Pflicht resource Ausgabeparameter (Referenz), der den Completion Code des Aufrufs enthält. Mögliche Werte: MQCC_OK (0), MQCC_WARNING (1), MQCC_FAILED (2).
$reason Pflicht resource Ausgabeparameter (Referenz), der den IBM-MQ-Reason-Code enthält, der den Completion Code näher beschreibt. Bei Erfolg ist der Wert MQRC_NONE (0). Der Wert kann mit mqseries_strerror in einen lesbaren Text umgewandelt werden.

Rückgabewert

Typ
void
Beschreibung
Diese Funktion gibt keinen Rückgabewert zurück. Erfolg und Fehler werden ausschließlich über $compCode und $reason signalisiert.

Beispiele

Verbindung zu einem Queue-Manager trennen

<?php
// Verbindung zum Queue-Manager herstellen
mqseries_conn('QM_TEST', $hconn, $compCode, $reason);

if ($compCode !== MQCC_OK) {
    echo 'Verbindung fehlgeschlagen: ' . mqseries_strerror($reason);
    exit(1);
}

echo 'Verbindung erfolgreich hergestellt.' . PHP_EOL;

// ... Warteschlangenoperationen durchführen ...

// Verbindung wieder trennen
mqseries_disc($hconn, $compCode, $reason);

if ($compCode !== MQCC_OK) {
    echo 'Fehler beim Trennen der Verbindung: ' . mqseries_strerror($reason);
} else {
    echo 'Verbindung erfolgreich getrennt.' . PHP_EOL;
}
Verbindung erfolgreich hergestellt. Verbindung erfolgreich getrennt.

Vollständiges Beispiel mit Queue öffnen und sauber schließen

<?php
// Verbindung herstellen
mqseries_conn('QM_PROD', $hconn, $compCode, $reason);
if ($compCode !== MQCC_OK) {
    die('MQCONN fehlgeschlagen: ' . mqseries_strerror($reason));
}

// Queue öffnen
$mqDesc = [
    'StrucId'  => MQOD_DEFAULT,
    'ObjectName' => 'TEST.QUEUE',
    'ObjectType' => MQOT_Q,
];
mqseries_open($hconn, $mqDesc, MQOO_INPUT_AS_Q_DEF | MQOO_FAIL_IF_QUIESCING, $hobj, $compCode, $reason);
if ($compCode !== MQCC_OK) {
    // Verbindung trotzdem sauber trennen
    mqseries_disc($hconn, $compCode2, $reason2);
    die('MQOPEN fehlgeschlagen: ' . mqseries_strerror($reason));
}

// ... Nachrichten verarbeiten ...

// Queue schließen
mqseries_close($hconn, $hobj, MQCO_NONE, $compCode, $reason);
if ($compCode !== MQCC_OK) {
    echo 'Warnung beim Schließen der Queue: ' . mqseries_strerror($reason) . PHP_EOL;
}

// Verbindung trennen
mqseries_disc($hconn, $compCode, $reason);
if ($compCode !== MQCC_OK) {
    echo 'Fehler beim Trennen: ' . mqseries_strerror($reason) . PHP_EOL;
} else {
    echo 'Ressourcen sauber freigegeben.' . PHP_EOL;
}
Ressourcen sauber freigegeben.

// Wichtig · Fallstricke

Reihenfolge beachten: Alle mit mqseries_open geöffneten Objekte (Queues, Topics usw.) sollten vor dem Aufruf von mqseries_disc explizit mit mqseries_close geschlossen werden. IBM MQ schließt zwar verbleibende Objekte beim Disconnect implizit, allerdings können dabei uncommittete Transaktionen verloren gehen oder Rollbacks ausgelöst werden.

Transaktionen: Falls eine laufende Einheits-Transaktion (Unit of Work) offen ist, sollte diese vor dem Disconnect mit mqseries_back (Rollback) oder mqseries_cmit (Commit) abgeschlossen werden. Ein unkontrolliertes mqseries_disc führt in der Regel zu einem automatischen Rollback.

Fehlerbehandlung: Da mqseries_disc keinen direkten Rückgabewert liefert, müssen $compCode und $reason nach jedem Aufruf geprüft werden. Der Aufruf mqseries_strerror($reason) wandelt den numerischen Reason Code in eine lesbare Fehlermeldung um.