Unterstützte Funktionen
TrueAsync passt über 70 Standard-PHP-Funktionen für nicht-blockierenden Betrieb innerhalb von Koroutinen an. Alle aufgeführten Funktionen werden automatisch asynchron, wenn sie innerhalb einer Koroutine aufgerufen werden. Außerhalb einer Koroutine funktionieren sie wie gewohnt.
DNS
| Funktion | Beschreibung |
|---|
gethostbyname() | Hostname in IP-Adresse auflösen |
gethostbyaddr() | IP-Adresse in Hostname auflösen |
gethostbynamel() | Liste der IP-Adressen für Hostname abrufen |
Datenbanken
PDO MySQL
| Funktion | Beschreibung |
|---|
PDO::__construct() | Nicht-blockierende Verbindung |
PDO::prepare() | Anweisung vorbereiten |
PDO::exec() | Abfrage ausführen |
PDOStatement::execute() | Vorbereitete Anweisung ausführen |
PDOStatement::fetch() | Ergebnisse abrufen |
PDO PgSQL
| Funktion | Beschreibung |
|---|
PDO::__construct() | Nicht-blockierende Verbindung |
PDO::prepare() | Anweisung vorbereiten |
PDO::exec() | Abfrage ausführen |
PDOStatement::execute() | Vorbereitete Anweisung ausführen |
PDOStatement::fetch() | Ergebnisse abrufen |
PDO Connection Pooling
Transparentes Connection Pooling für PDO über Async\Pool-Integration. Jede Koroutine erhält eine eigene Verbindung aus dem Pool mit automatischer Lebenszyklusverwaltung.
MySQLi
| Funktion | Beschreibung |
|---|
mysqli_connect() | Nicht-blockierende Verbindung |
mysqli_query() | Abfrage ausführen |
mysqli_prepare() | Anweisung vorbereiten |
mysqli_stmt_execute() | Vorbereitete Anweisung ausführen |
mysqli_fetch_*() | Ergebnisse abrufen |
PostgreSQL (nativ)
| Funktion | Beschreibung |
|---|
pg_connect() | Nicht-blockierende Verbindung |
pg_query() | Abfrage ausführen |
pg_prepare() | Anweisung vorbereiten |
pg_execute() | Vorbereitete Anweisung ausführen |
pg_fetch_*() | Ergebnisse abrufen |
Jeder Async-Kontext verwendet eine separate Verbindung für sichere Nebenläufigkeit.
CURL
| Funktion | Beschreibung |
|---|
curl_exec() | Anfrage ausführen |
curl_multi_exec() | Mehrere Anfragen ausführen |
curl_multi_select() | Auf Aktivität warten |
curl_multi_getcontent() | Inhalt abrufen |
curl_setopt() | Optionen setzen |
curl_getinfo() | Anfrageinformationen abrufen |
curl_error() | Fehler abrufen |
curl_close() | Handle schließen |
Sockets
| Funktion | Beschreibung |
|---|
socket_create() | Socket erstellen |
socket_create_pair() | Socket-Paar erstellen |
socket_connect() | Verbinden |
socket_accept() | Verbindung annehmen |
socket_read() | Daten lesen |
socket_write() | Daten schreiben |
socket_send() | Daten senden |
socket_recv() | Daten empfangen |
socket_sendto() | An Adresse senden |
socket_recvfrom() | Von Adresse empfangen |
socket_bind() | An Adresse binden |
socket_listen() | Lauschen |
socket_select() | Socket-Aktivität überwachen |
Datei- und Stream-E/A
| Funktion | Beschreibung |
|---|
fopen() | Datei öffnen |
fclose() | Datei schließen |
fread() | Aus Datei lesen |
fwrite() | In Datei schreiben |
fgets() | Zeile lesen |
fgetc() | Zeichen lesen |
fgetcsv() | CSV-Zeile lesen |
fputcsv() | CSV-Zeile schreiben |
fseek() | Position setzen |
ftell() | Position abrufen |
rewind() | Position zurücksetzen |
ftruncate() | Datei kürzen |
fflush() | Puffer leeren |
fscanf() | Formatiertes Lesen |
file_get_contents() | Gesamte Datei lesen |
file_put_contents() | Gesamte Datei schreiben |
file() | Datei in Array lesen |
copy() | Datei kopieren |
tmpfile() | Temporäre Datei erstellen |
readfile() | Datei ausgeben |
fpassthru() | Rest der Datei ausgeben |
stream_get_contents() | Rest des Streams lesen |
stream_copy_to_stream() | Zwischen Streams kopieren |
flock() | Dateisperrung (über Thread-Pool) |
Wichtig: flock() verwendet den Thread-Pool. Die Funktion flock() ist ein blockierender Systemaufruf, der nicht über libuv-I/O-Events nicht-blockierend gemacht werden kann. Innerhalb einer Coroutine werden blockierende Sperr-Operationen (LOCK_SH, LOCK_EX) an den libuv-Thread-Pool ausgelagert, sodass andere Coroutinen weiterarbeiten können, während auf die Sperre gewartet wird. Nicht-blockierende Sperren (LOCK_NB) und Entsperrungen (LOCK_UN) werden direkt ohne Thread-Pool ausgeführt.
Wichtig: Timeouts für Dateien und Pipe-Streams. PHP unterstützt nativ keine Timeouts für Lese-/Schreiboperationen auf Dateien und Pipe-Streams — Standard-Funktionen wie fread(), fwrite() und andere können unbegrenzt blockieren. TrueAsync löst dieses Problem: Wenn ein Timeout für einen Stream gesetzt ist (über stream_set_timeout()), registriert die Leseoperation gleichzeitig ein IO-Ereignis und einen Timer. Wenn der Timer vor Abschluss der IO auslöst, wird das Lesen abgebrochen und die Coroutine erhält das Ergebnis -1 (Timeout-Indikator). Dies funktioniert nur innerhalb von Coroutinen — außerhalb bleibt das Verhalten standard.
Stream-Sockets
| Funktion | Beschreibung |
|---|
stream_socket_client() | Client-Verbindung erstellen |
stream_socket_server() | Server-Socket erstellen |
stream_socket_accept() | Verbindung annehmen |
stream_select() | Stream-Aktivität überwachen |
stream_context_create() | Async-fähigen Kontext erstellen |
Einschränkung: stream_select() mit Pipe-Streams (z.B. von proc_open()) wird unter Windows nicht unterstützt. Unter Linux/macOS funktioniert es nativ über die Event-Schleife.
Prozessausführung
| Funktion | Beschreibung |
|---|
proc_open() | Prozess mit Pipes öffnen |
proc_close() | Prozess schließen |
exec() | Externen Befehl ausführen |
shell_exec() | Shell-Befehl ausführen |
system() | Systembefehl ausführen |
passthru() | Ausführen mit direkter Ausgabe |
Wichtig: proc_close() und pclose() blockieren die Coroutine. Der Aufruf von proc_close() oder pclose() wartet auf das Ende des Kindprozesses. Innerhalb einer Coroutine blockiert dies die aktuelle Coroutine bis der Prozess beendet ist — andere Coroutinen laufen weiter. Dasselbe geschieht bei impliziten Aufrufen über Destruktoren: Wenn eine Variable mit einer Prozess-Ressource den Gültigkeitsbereich verlässt oder vom Garbage Collector zerstört wird, ruft der Destruktor pclose() auf, was die Coroutine blockiert, in der die Garbage Collection läuft.
Empfehlung: Schließen Sie Prozesse immer explizit über proc_close(), anstatt sich auf Destruktoren zu verlassen, damit Sie kontrollieren können, welche Coroutine blockiert wird.
Timer und Verzögerungen
| Funktion | Beschreibung |
|---|
sleep() | Verzögerung in Sekunden |
usleep() | Verzögerung in Mikrosekunden |
time_nanosleep() | Nanosekunden-genaue Verzögerung |
time_sleep_until() | Warten bis Zeitstempel |
Ausgabepufferung
Jede Koroutine erhält einen isolierten Ausgabepuffer.
| Funktion | Beschreibung |
|---|
ob_start() | Pufferung starten |
ob_flush() | Puffer leeren |
ob_clean() | Puffer bereinigen |
ob_get_contents() | Pufferinhalt abrufen |
ob_end_clean() | Pufferung beenden |
Noch nicht unterstützt
Funktionen, die zur Implementierung geplant oder noch nicht angepasst sind.
DNS
| Funktion | Beschreibung |
|---|
dns_check_record() / checkdnsrr() | DNS-Eintrag prüfen |
dns_get_mx() / getmxrr() | MX-Einträge abrufen |
dns_get_record() | DNS-Ressourceneinträge abrufen |
Datenbanken
| Erweiterung | Beschreibung |
|---|
| PDO ODBC | ODBC-Treiber |
| PDO Oracle | Oracle-Treiber |
| PDO SQLite | SQLite-Treiber |
| PDO Firebird | Firebird-Treiber |
| MongoDB | MongoDB-Client |
| Funktion | Beschreibung |
|---|
opendir() / readdir() / closedir() | Verzeichnisdurchlauf |
unlink() / rename() | Datei löschen und umbenennen |
mkdir() / rmdir() | Verzeichnis erstellen und entfernen |
stat() / lstat() | Dateiinformationen |
readlink() | Symbolische Links lesen |
Hinweis: Datei-Metadatenoperationen auf lokalen Festplatten werden in Mikrosekunden abgeschlossen. Ihre Asynchronität ist nur bei Netzwerkdateisystemen (NFS) sinnvoll.
Wie geht es weiter?