Start · Sprachen · PHP · Referenz · eio_custom

eio_custom

Funktion

Führt eine benutzerdefinierte Funktion asynchron aus, wie jeden anderen <code>eio_*</code>-Aufruf im Event-Loop.

Kategorie: io

Signatur

eio_custom(callable $execute, int $pri, callable $callback, mixed $data = NULL): resource

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

Typ
resource
Beschreibung
Gibt eine 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();
?>
Berechnung abgeschlossen. Limit: 100 Summe: 5050

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();
}
?>
Inhalt von /etc/hostname: mein-server

// 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).