Signatur
Beschreibung
eio_custom ermöglicht es, eine eigene PHP-Funktion ($execute) in den asynchronen libeio-Verarbeitungspool einzureihen und sie wie eine native eio_*-Funktion auszuführen. Dadurch lassen sich beliebige zeitintensive Operationen (z. B. Berechnungen, externe Prozessaufrufe oder Datenbankoperationen) in den Event-Loop integrieren, ohne den Hauptthread zu blockieren.
Der Ablauf ist zweistufig: Zuerst wird $execute in einem Worker-Thread ausgeführt und gibt einen Wert zurück. Dieser Wert wird anschließend im Hauptthread an die $callback-Funktion übergeben, sodass das Ergebnis sicher weiterverarbeitet werden kann.
Wichtig: Die Funktion setzt die PHP-Erweiterung eio voraus, die auf POSIX-Systemen (Linux, macOS) verfügbar ist. Sie eignet sich besonders in Kombination mit Event-Loop-Bibliotheken wie libevent oder React, um nicht blockierende I/O-Anwendungen zu bauen.
Der Prioritätsparameter $pri steuert die Reihenfolge, in der Anfragen abgearbeitet werden — höhere Priorität bedeutet bevorzugte Ausführung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $execute Pflicht | callable | Die benutzerdefinierte Funktion, die im Worker-Thread ausgeführt wird. Sie erhält $data als einzigen Parameter und ihr Rückgabewert wird an $callback weitergereicht. |
|
| $pri Pflicht | int | Priorität der Anfrage. Mögliche Werte: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX oder null (entspricht EIO_PRI_DEFAULT). |
|
| $callback Pflicht | callable | Rückruf-Funktion, die im Hauptthread aufgerufen wird, sobald $execute abgeschlossen ist. Signatur: callback(mixed $data, mixed $result), wobei $result der Rückgabewert von $execute ist. |
|
| $data | mixed | NULL | Beliebige benutzerdefinierte Daten, die sowohl an $execute als auch an $callback weitergegeben werden. |
Rückgabewert
eio-Request-Resource zurück, wenn die Anfrage erfolgreich in die Warteschlange eingereiht wurde, oder false im Fehlerfall.Beispiele
Einfache benutzerdefinierte asynchrone Berechnung
<?php
// Voraussetzung: eio-Erweiterung ist installiert und geladen
// Benutzdefinierte Funktion, die im Worker-Thread läuft
function my_custom_execute($data) {
// Simuliert eine zeitintensive Operation
$result = array_sum(range(1, $data['limit']));
return $result;
}
// Callback, der im Hauptthread nach Abschluss aufgerufen wird
function my_custom_callback($data, $result) {
echo "Berechnung abgeschlossen." . PHP_EOL;
echo "Limit: " . $data['limit'] . PHP_EOL;
echo "Summe: " . $result . PHP_EOL;
}
$data = ['limit' => 100];
$req = eio_custom('my_custom_execute', EIO_PRI_DEFAULT, 'my_custom_callback', $data);
// Event-Loop starten
eio_event_loop();
?>
eio_custom mit anonymen Funktionen und Fehlerbehandlung
<?php
// Daten für die asynchrone Verarbeitung
$taskData = ['filename' => '/etc/hostname'];
$req = eio_custom(
// Worker-Funktion (läuft im Thread)
function($data) {
if (!file_exists($data['filename'])) {
return null;
}
return file_get_contents($data['filename']);
},
EIO_PRI_DEFAULT,
// Callback im Hauptthread
function($data, $result) {
if ($result === null) {
echo "Datei nicht gefunden: " . $data['filename'] . PHP_EOL;
} else {
echo "Inhalt von " . $data['filename'] . ": " . trim($result) . PHP_EOL;
}
},
$taskData
);
if ($req === false) {
echo "Fehler: eio_custom konnte nicht eingereiht werden." . PHP_EOL;
} else {
eio_event_loop();
}
?>
// Wichtig · Fallstricke
Plattform: eio_custom und die gesamte eio-Erweiterung sind nur auf POSIX-kompatiblen Betriebssystemen verfügbar (Linux, macOS). Unter Windows wird diese Erweiterung nicht unterstützt.
Thread-Sicherheit: Die $execute-Funktion läuft in einem separaten Worker-Thread. Es dürfen keine nicht-thread-sicheren Ressourcen (z. B. bestimmte Datenbankverbindungen, globale Zustände) innerhalb von $execute verwendet werden. Datenbankoperationen sollten besser im Callback durchgeführt werden.
Event-Loop: Damit die Callbacks ausgeführt werden, muss der Event-Loop explizit gestartet werden, z. B. durch eio_event_loop() oder durch Integration in einen bestehenden Loop (z. B. via eio_get_event_stream() mit libevent).