Signatur
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
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;
?>
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";
?>
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";
?>
// Wichtig · Fallstricke
Voraussetzung: Die PECL-Erweiterung event muss installiert sein (pecl install event). Diese ist nicht standardmäßig in PHP enthalten.
- Thread-Sicherheit:
EventBufferist 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()undappendFrom()verschieben Daten ohne Kopieren zwischen Puffern – ideal für performante Weiterleitungen.