Start · Sprachen · PHP · Referenz · win32_set_service_status

win32_set_service_status

Funktion

Aktualisiert den Dienststatus eines unter Windows laufenden PHP-Prozesses gegenüber dem Windows Service Control Manager (SCM).

seit PHP 5.4.0 Kategorie: misc

Signatur

win32_set_service_status(int $status, int $checkpoint = 0): void

Beschreibung

win32_set_service_status() teilt dem Windows Service Control Manager (SCM) den aktuellen Status eines als Windows-Dienst laufenden PHP-Skripts mit. Die Funktion ist Teil der win32service-PECL-Extension und wird ausschließlich unter Windows eingesetzt.

Typische Statuswerte sind WIN32_SERVICE_RUNNING, WIN32_SERVICE_STOP_PENDING oder WIN32_SERVICE_STOPPED. Ohne regelmäßige Statusmeldungen kann der SCM davon ausgehen, dass der Dienst nicht mehr reagiert, und ihn beenden oder als fehlerhaft markieren.

Der optionale Parameter $checkpoint wird beim Status WIN32_SERVICE_START_PENDING, WIN32_SERVICE_STOP_PENDING usw. verwendet, um dem SCM Fortschritt zu signalisieren – er sollte bei jedem Aufruf inkrementiert werden, solange der Dienst noch initialisiert oder beendet wird.

Diese Funktion sollte innerhalb der Hauptschleife des Dienstes regelmäßig aufgerufen werden, um dem SCM zu signalisieren, dass der Dienst noch aktiv und funktionsfähig ist.

Parameter

Name Typ Default Beschreibung
$status Pflicht int Der neue Dienststatus. Gültige Werte sind Konstanten wie WIN32_SERVICE_RUNNING, WIN32_SERVICE_STOPPED, WIN32_SERVICE_STOP_PENDING, WIN32_SERVICE_START_PENDING usw., die von der win32service-Extension bereitgestellt werden.
$checkpoint int 0 Ein Fortschrittszähler, der bei langen Start- oder Stopvorgängen inkrementiert werden sollte, um dem SCM zu signalisieren, dass Fortschritt gemacht wird und der Dienst nicht hängt.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück. Bei einem Fehler (z. B. wenn die Extension nicht geladen ist oder der Aufruf außerhalb eines Windows-Dienstkontexts erfolgt) wird eine Warnung ausgegeben.

Beispiele

Einfache Dienst-Hauptschleife mit Statusmeldungen

<?php
// Dienst-Startphase signalisieren
win32_set_service_status(WIN32_SERVICE_START_PENDING, 1);

// Initialisierung durchführen (z. B. Datenbankverbindung herstellen)
sleep(2);

// Dienst ist jetzt bereit
win32_set_service_status(WIN32_SERVICE_RUNNING);

// Hauptschleife des Dienstes
while (WIN32_SERVICE_CONTROL_STOP !== win32_get_last_control_message()) {
    // Arbeit erledigen
    doWork();

    // SCM mitteilen, dass der Dienst noch läuft
    win32_set_service_status(WIN32_SERVICE_RUNNING);
    sleep(5);
}

// Dienst beenden
win32_set_service_status(WIN32_SERVICE_STOPPED);

function doWork(): void {
    // Beispiel: Log-Eintrag schreiben
    file_put_contents('C:\\service.log', date('c') . " Dienst läuft\n", FILE_APPEND);
}

Langen Startvorgang mit Checkpoint-Inkrement signalisieren

<?php
$checkpoint = 1;

// Phase 1: Konfiguration laden
win32_set_service_status(WIN32_SERVICE_START_PENDING, $checkpoint++);
loadConfig();

// Phase 2: Datenbankverbindung herstellen
win32_set_service_status(WIN32_SERVICE_START_PENDING, $checkpoint++);
connectDatabase();

// Phase 3: Cache aufwärmen
win32_set_service_status(WIN32_SERVICE_START_PENDING, $checkpoint++);
warmUpCache();

// Dienst ist betriebsbereit
win32_set_service_status(WIN32_SERVICE_RUNNING);

function loadConfig(): void { sleep(1); }
function connectDatabase(): void { sleep(2); }
function warmUpCache(): void { sleep(1); }

// Wichtig · Fallstricke

Plattformbeschränkung: Diese Funktion ist ausschließlich unter Windows verfügbar und erfordert die Installation der win32service-PECL-Extension. Auf Unix/Linux-Systemen ist sie nicht vorhanden.

Ab win32service 1.0.0 wurde die API teilweise geändert: Fehler werden nun als Win32ServiceException geworfen statt als Fehlercodes zurückgegeben. Prüfe die installierte Versionsnummer der Extension, um die korrekte Fehlerbehandlung zu implementieren.

Ein fehlender oder zu seltener Aufruf von win32_set_service_status() kann dazu führen, dass der SCM den Dienst als nicht reagierend einstuft und ihn zwangsbeendet. Die Funktion sollte daher innerhalb der Dienstschleife in regelmäßigen, kurzen Abständen aufgerufen werden.