Start · Sprachen · PHP · Referenz · win32_get_last_control_message

win32_get_last_control_message

Funktion

Gibt die zuletzt vom Windows Service Control Manager an den Dienst gesendete Steuernachricht als Integer-Wert zurück.

seit PHP 5.4.0 Kategorie: misc

Signatur

win32_get_last_control_message(): int

Beschreibung

win32_get_last_control_message() ist Teil der win32service-Erweiterung und wird ausschließlich unter Windows verwendet. Die Funktion liefert den zuletzt empfangenen Steuerbefehl, den der Windows Service Control Manager (SCM) an den laufenden PHP-Dienst gesendet hat.

Typische Steuernachrichten sind beispielsweise WIN32_SERVICE_CONTROL_STOP (Dienst anhalten), WIN32_SERVICE_CONTROL_PAUSE (Dienst pausieren) oder WIN32_SERVICE_CONTROL_CONTINUE (Dienst fortsetzen). In der Hauptschleife eines Windows-Dienstes wird diese Funktion regelmäßig aufgerufen, um auf Befehle des Betriebssystems reagieren zu können und den Dienst ordnungsgemäß zu beenden oder zu steuern.

Die Funktion gibt eine Ganzzahl zurück, die mit den vordefinierten Konstanten der win32service-Erweiterung verglichen werden sollte. Ohne aktive Dienstumgebung (z. B. bei Ausführung über die Kommandozeile) liefert sie in der Regel 0.

Rückgabewert

Typ
int
Beschreibung
Gibt den Integer-Wert der zuletzt empfangenen Steuernachricht zurück, z. B. WIN32_SERVICE_CONTROL_STOP (1), WIN32_SERVICE_CONTROL_PAUSE (2) oder WIN32_SERVICE_CONTROL_CONTINUE (3). Wurde noch keine Nachricht empfangen oder ist keine Dienstumgebung aktiv, wird 0 zurückgegeben.

Beispiele

Hauptschleife eines Windows-Dienstes mit Steuerbefehl-Auswertung

<?php
// Dienst registrieren und starten
win32_start_service_ctrl_dispatcher('MeinPHPDienst');

// Initialen Status setzen
win32_set_service_status(WIN32_SERVICE_RUNNING);

// Hauptschleife des Dienstes
while (true) {
    // Letzte Steuernachricht abrufen
    $nachricht = win32_get_last_control_message();

    switch ($nachricht) {
        case WIN32_SERVICE_CONTROL_STOP:
        case WIN32_SERVICE_CONTROL_SHUTDOWN:
            // Dienst ordnungsgemäß beenden
            win32_set_service_status(WIN32_SERVICE_STOPPED);
            exit();

        case WIN32_SERVICE_CONTROL_PAUSE:
            win32_set_service_status(WIN32_SERVICE_PAUSED);
            break;

        case WIN32_SERVICE_CONTROL_CONTINUE:
            win32_set_service_status(WIN32_SERVICE_RUNNING);
            break;

        default:
            // Reguläre Arbeit des Dienstes ausführen
            // z. B. Aufgaben abarbeiten, Logs schreiben etc.
            break;
    }

    // Kurze Pause, um CPU-Last zu reduzieren
    sleep(1);
}

Einfacher Stop-Check in einer Dienstschleife

<?php
win32_start_service_ctrl_dispatcher('EinfacherDienst');
win32_set_service_status(WIN32_SERVICE_RUNNING);

do {
    // Arbeitslogik hier
    error_log('Dienst läuft: ' . date('Y-m-d H:i:s'));
    sleep(5);
} while (win32_get_last_control_message() != WIN32_SERVICE_CONTROL_STOP);

win32_set_service_status(WIN32_SERVICE_STOPPED);
exit();

// Wichtig · Fallstricke

Plattformabhängigkeit: Diese Funktion steht ausschließlich unter Windows zur Verfügung und erfordert die installierte win32service-PECL-Erweiterung. Auf Linux/macOS ist sie nicht vorhanden.

Erweiterungsänderungen: Ab Version 0.4.0 der win32service-Erweiterung (für PHP 8) wurde das Verhalten der Funktion angepasst. Bei einem Fehler wird eine Win32ServiceException ausgelöst, anstatt einen Fehlercode zurückzugeben. Der Code sollte entsprechend mit try/catch abgesichert werden.

Die Funktion sollte nur innerhalb einer registrierten Dienstumgebung (nach win32_start_service_ctrl_dispatcher()) aufgerufen werden, da sie außerhalb keine sinnvollen Werte liefert.