Start · Sprachen · PHP · Referenz · EventBuffer

EventBuffer

Klasse

Repräsentiert Libevents <code>evbuffer</code> – einen effizienten, verketteten Puffer für gepufferte Ein-/Ausgabe in ereignisgesteuerten Anwendungen.

seit PHP 1.5.0 Kategorie: io

Signatur

class EventBuffer

Beschreibung

EventBuffer ist Teil der PHP-Erweiterung event und kapselt Libevents evbuffer-Struktur. Ein EventBuffer ist ein flexibler Byte-Puffer, der intern aus einer verketteten Liste von Speicherblöcken besteht. Daten können ohne Umkopieren an das Ende angehängt oder vom Anfang gelesen und entfernt werden, was besonders bei Netzwerkanwendungen mit hohem Durchsatz vorteilhaft ist.

Typische Einsatzgebiete sind Netzwerk-Server und -Clients, die auf Basis von EventBufferEvent arbeiten: EventBuffer stellt den Lese- und Schreibpuffer bereit, in den eingehende Daten automatisch geschrieben und aus dem ausgehende Daten gesendet werden. Der Zugriff auf diese Puffer erfolgt über EventBufferEvent::getInput() und EventBufferEvent::getOutput().

Der Puffer unterstützt effiziente Operationen wie add(), addBuffer(), read(), readLine(), drain() sowie search() und copyout(). Er kann auch direkt mit Dateien oder anderen Puffern über addFile() und appendFrom() kombiniert werden. Durch zero-copy-Mechanismen vermeidet die Bibliothek unnötige Datenkopien zwischen Puffern.

Ein EventBuffer-Objekt kann entweder direkt instanziiert oder über EventBufferEvent bezogen werden. Es ist nicht thread-safe und sollte immer nur im selben Event-Loop-Thread verwendet werden.

Parameter

Name Typ Default Beschreibung
$— Der Konstruktor benötigt keine Parameter. Ein leerer Puffer wird erstellt.

Rückgabewert

Typ

Beispiele

Einfaches Schreiben und Lesen aus einem EventBuffer

<?php
// Erfordert die PECL-Erweiterung 'event'
$buf = new EventBuffer();

// Daten in den Puffer schreiben
$buf->add("Hallo, Welt!\n");
$buf->add("Zweite Zeile\n");

echo "Länge des Puffers: " . $buf->length . "\n";

// Erste Zeile lesen (bis zum Zeilenumbruch)
$line = $buf->readLine(EventBuffer::EOL_CRLF_STRICT);
if ($line === null) {
    $line = $buf->readLine(EventBuffer::EOL_LF);
}
echo "Gelesene Zeile: " . $line . "\n";

// Verbleibende Daten als String lesen
$rest = $buf->read($buf->length);
echo "Rest: " . $rest;
?>
Länge des Puffers: 26 Gelesene Zeile: Hallo, Welt! Rest: Zweite Zeile

Pufferinhalte zwischen zwei EventBuffern verschieben (zero-copy)

<?php
$src = new EventBuffer();
$dst = new EventBuffer();

$src->add("Datenblock A");
$src->add("Datenblock B");

echo "src vor Transfer: " . $src->length . " Bytes\n";
echo "dst vor Transfer: " . $dst->length . " Bytes\n";

// Alle Daten von $src nach $dst verschieben (zero-copy)
$dst->addBuffer($src);

echo "src nach Transfer: " . $src->length . " Bytes\n";
echo "dst nach Transfer: " . $dst->length . " Bytes\n";

$data = $dst->read($dst->length);
echo "Inhalt dst: " . $data . "\n";
?>
src vor Transfer: 24 Bytes dst vor Transfer: 0 Bytes src nach Transfer: 0 Bytes dst nach Transfer: 24 Bytes Inhalt dst: Datenblock ADatenblock B

EventBuffer als Schreibpuffer eines EventBufferEvent verwenden

<?php
$base = new EventBase();
$bev = new EventBufferEvent(
    $base,
    null,
    EventBufferEvent::OPT_CLOSE_ON_FREE
);

// Ausgabepuffer des BufferEvents holen
$output = $bev->getOutput();

// HTTP-Antwort in den Ausgabepuffer schreiben
$output->add("HTTP/1.1 200 OK\r\n");
$output->add("Content-Type: text/plain\r\n");
$output->add("\r\n");
$output->add("Hallo von EventBuffer!");

echo "Ausgabepuffer enthält " . $output->length . " Bytes\n";
?>
Ausgabepuffer enthält 68 Bytes

// Wichtig · Fallstricke

Voraussetzung: Die PECL-Erweiterung event muss installiert sein (pecl install event). Diese ist nicht standardmäßig in PHP enthalten.

  • Thread-Sicherheit: EventBuffer ist nicht thread-safe. Mehrere Threads dürfen nicht gleichzeitig auf denselben Puffer zugreifen, ohne externe Synchronisation.
  • Speicherverwaltung: Der Puffer allokiert intern Speicher dynamisch. Bei sehr großen Datenmengen sollte drain() regelmäßig aufgerufen werden, um verarbeitete Daten zu entfernen und Speicher freizugeben.
  • EOL-Konstanten: Beim Lesen mit readLine() muss die korrekte EOL-Konstante gewählt werden (EventBuffer::EOL_LF, EventBuffer::EOL_CRLF, EventBuffer::EOL_CRLF_STRICT, EventBuffer::EOL_ANY).
  • Zero-Copy: addBuffer() und appendFrom() verschieben Daten ohne Kopieren zwischen Puffern – ideal für performante Weiterleitungen.