Signatur
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
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.