Start · Sprachen · PHP · Referenz · eio_busy

eio_busy

Funktion

Simuliert künstliche Last durch Blockierung des EIO-Threads für eine bestimmte Zeit – nützlich für Tests und Benchmarks.

seit PHP 0.3.0 Kategorie: io

Signatur

eio_busy(int $delay, int $pri = EIO_PRI_DEFAULT, callable $callback = NULL, mixed $data = NULL): resource

Beschreibung

eio_busy() ist eine Testfunktion aus der EIO-Erweiterung (Asynchrones I/O), die einen EIO-Worker-Thread für eine angegebene Anzahl von Sekunden künstlich beschäftigt hält. Dies ermöglicht es, Lastszenarien in Benchmarks und Tests zu simulieren, ohne echte I/O-Operationen durchführen zu müssen.

Die Funktion ist besonders nützlich, um das Verhalten einer Anwendung unter hoher EIO-Last zu testen oder die Skalierbarkeit des Thread-Pools zu messen. Sie eignet sich außerdem dazu, Timeouts und Scheduling-Verhalten zu überprüfen.

Wie alle EIO-Funktionen arbeitet eio_busy() asynchron: Der Aufruf kehrt sofort zurück und liefert eine Anfrage-Ressource. Wenn der Delay abgelaufen ist, wird der angegebene $callback aufgerufen. Die EIO-Ereignisschleife muss daher mit eio_event_loop() oder einer entsprechenden Integrations-Methode betrieben werden.

Außerhalb von Test- und Benchmark-Szenarien hat diese Funktion keinen produktiven Nutzen – sie verbraucht absichtlich Rechenzeit ohne nützliche Arbeit zu leisten.

Parameter

Name Typ Default Beschreibung
$delay Pflicht int Anzahl der Sekunden, für die der Worker-Thread künstlich blockiert werden soll.
$pri int EIO_PRI_DEFAULT Priorität der Anfrage. Gültige Werte sind EIO_PRI_MIN, EIO_PRI_DEFAULT und EIO_PRI_MAX.
$callback callable NULL Callback-Funktion, die nach Ablauf des Delays aufgerufen wird. Signatur: function(mixed $data, int $result): void. $result ist immer 0 bei Erfolg.
$data mixed NULL Beliebige Benutzerdaten, die unverändert an den $callback weitergegeben werden.

Rückgabewert

Typ
resource
Beschreibung
Gibt bei Erfolg eine EIO-Anfrage-Ressource zurück, die z. B. mit eio_cancel() abgebrochen werden kann. Bei einem Fehler wird false zurückgegeben.

Beispiele

Einfacher Busy-Test mit Callback

<?php
// EIO-Erweiterung muss geladen sein

$startTime = microtime(true);

$req = eio_busy(2, EIO_PRI_DEFAULT, function ($data, $result) use ($startTime) {
    $elapsed = round(microtime(true) - $startTime, 2);
    echo "Busy-Anfrage abgeschlossen nach {$elapsed} Sekunden.\n";
    echo "Ergebnis: {$result}\n";
    echo "Daten: {$data}\n";
}, 'Testdaten');

// Ereignisschleife ausführen, bis alle Anfragen abgeschlossen sind
eio_event_loop();
Busy-Anfrage abgeschlossen nach 2.00 Sekunden. Ergebnis: 0 Daten: Testdaten

Parallele Busy-Anfragen für Thread-Pool-Benchmark

<?php
// Mehrere parallele Busy-Anfragen erzeugen, um den Thread-Pool auszulasten

$pending = 0;
$total   = 4;

for ($i = 0; $i < $total; $i++) {
    $pending++;
    eio_busy(1, EIO_PRI_DEFAULT, function ($data, $result) use (&$pending) {
        echo "Thread {$data} fertig (Ergebnis: {$result})\n";
        $pending--;
        if ($pending === 0) {
            echo "Alle Threads abgeschlossen.\n";
        }
    }, "Thread #{$i}");
}

eio_event_loop();
Thread #0 fertig (Ergebnis: 0) Thread #1 fertig (Ergebnis: 0) Thread #2 fertig (Ergebnis: 0) Thread #3 fertig (Ergebnis: 0) Alle Threads abgeschlossen.

// Wichtig · Fallstricke

Nur für Tests geeignet: eio_busy() sollte niemals in Produktionscode verwendet werden. Die Funktion blockiert absichtlich Worker-Threads, was in einer Produktionsumgebung zu Engpässen im Thread-Pool führen würde.

Die EIO-Erweiterung (pecl/eio) muss separat installiert und in der php.ini aktiviert sein. Sie ist nicht standardmäßig in PHP enthalten.

Bei der Nutzung in Kombination mit Event-Loop-Bibliotheken wie libevent oder libev muss die EIO-Integration korrekt eingebunden werden, damit der Callback zuverlässig ausgelöst wird.