Signatur
Beschreibung
swoole_event_write sendet Daten an einen Socket oder Dateideskriptor, der in der Swoole-Ereignisschleife (Event Loop) verwaltet wird. Die Funktion übergibt die Daten an den internen Schreibpuffer von Swoole, sodass der Schreibvorgang nicht blockiert und asynchron abgearbeitet wird.
Im Gegensatz zu einem direkten fwrite oder socket_write, das bei einem blockierenden Socket den aktuellen PHP-Prozess pausieren würde, puffert Swoole die Daten intern und schreibt sie, sobald der Socket für den Schreibvorgang bereit ist. Das ist besonders nützlich in hochperformanten, nicht-blockierenden Netzwerkanwendungen.
Diese Funktion ist typischerweise im Zusammenspiel mit swoole_event_add bzw. swoole_event_set zu verwenden, wenn man einen Socket manuell im Swoole-Event-Loop registriert hat. Sie eignet sich etwa für das Erstellen benutzerdefinierter Proxy-Server, Netzwerktunnel oder Low-Level-Socket-Kommunikation.
Hinweis: swoole_event_write ist Teil der prozeduralen API der Swoole-Erweiterung und steht nur zur Verfügung, wenn die Swoole-Erweiterung installiert und geladen ist. In modernen Swoole-Projekten wird oft die objektorientierte API bevorzugt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $fd Pflicht | mixed | Der Socket oder Dateideskriptor, an den die Daten geschrieben werden sollen. Kann eine Socket-Ressource, ein Stream oder eine Integer-Dateideskriptor-Nummer sein. | |
| $data Pflicht | string | Die zu sendenden Daten als String. Der Inhalt wird in den internen Swoole-Schreibpuffer gelegt und asynchron übertragen. |
Rückgabewert
true zurück, wenn die Daten erfolgreich in den Puffer geschrieben wurden. Gibt false zurück, wenn ein Fehler aufgetreten ist, z. B. wenn der angegebene Dateideskriptor nicht im Event Loop registriert ist oder ungültig ist.Beispiele
Asynchrones Schreiben in einen nicht-blockierenden Socket
<?php
// Erstelle einen nicht-blockierenden TCP-Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
socket_connect($socket, '127.0.0.1', 9501);
// Socket im Swoole Event Loop registrieren
swoole_event_add($socket, function ($socket) {
$data = socket_read($socket, 1024);
echo 'Empfangen: ' . $data . PHP_EOL;
});
// Daten asynchron an den Socket schreiben
$success = swoole_event_write($socket, "Hallo Server!\n");
if ($success) {
echo 'Daten wurden erfolgreich in den Puffer geschrieben.' . PHP_EOL;
} else {
echo 'Fehler beim Schreiben in den Socket.' . PHP_EOL;
}
// Event Loop starten
swoole_event_wait();
Verwendung mit stream_socket_client
<?php
// Einen nicht-blockierenden Stream-Socket erstellen
$stream = stream_socket_client(
'tcp://127.0.0.1:9501',
$errno,
$errstr,
0,
STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT
);
stream_set_blocking($stream, false);
// Im Event Loop registrieren und auf Antworten lauschen
swoole_event_add($stream, function ($stream) {
$response = fread($stream, 65535);
echo 'Server-Antwort: ' . $response . PHP_EOL;
swoole_event_del($stream);
});
// Nachricht asynchron senden
swoole_event_write($stream, "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n");
swoole_event_wait();
// Wichtig · Fallstricke
Erweiterungsabhängigkeit: swoole_event_write ist ausschließlich in der Swoole-Erweiterung verfügbar und kein Bestandteil des PHP-Kerns. Die Funktion kann nicht in Standard-PHP-Umgebungen ohne Swoole verwendet werden.
Pufferverhalten: Wenn der Socket-Sendepuffer voll ist, werden die Daten intern von Swoole gepuffert und in mehreren Durchläufen des Event Loops übertragen. Dies kann zu einer verzögerten Übertragung führen, blockiert den Prozess jedoch nicht.
Vorsicht bei großen Datenmengen: Bei sehr großen Datenmengen kann der interne Puffer von Swoole stark anwachsen. Es empfiehlt sich, die Größe der gesendeten Datenpakete zu überwachen und ggf. Flusskontrolle (Flow Control) zu implementieren.
Ressourcenverwaltung: Der Socket muss vor dem Aufruf von swoole_event_write mit swoole_event_add im Event Loop registriert worden sein. Andernfalls gibt die Funktion false zurück.