Signatur
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
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();
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();
// 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.