Funzioni supportate
TrueAsync adatta oltre 70 funzioni PHP standard per il funzionamento non-bloccante all'interno delle coroutine. Tutte le funzioni elencate diventano automaticamente asincrone quando vengono chiamate all'interno di una coroutine. Al di fuori di una coroutine, funzionano normalmente.
DNS
| Funzione | Descrizione |
|---|
gethostbyname() | Risolvere nome host in indirizzo IP |
gethostbyaddr() | Risoluzione inversa dell'indirizzo IP in nome host |
gethostbynamel() | Ottenere l'elenco degli indirizzi IP per un nome host |
Database
PDO MySQL
| Funzione | Descrizione |
|---|
PDO::__construct() | Connessione non-bloccante |
PDO::prepare() | Preparare query |
PDO::exec() | Eseguire query |
PDOStatement::execute() | Eseguire query preparata |
PDOStatement::fetch() | Recuperare risultati |
PDO PgSQL
| Funzione | Descrizione |
|---|
PDO::__construct() | Connessione non-bloccante |
PDO::prepare() | Preparare query |
PDO::exec() | Eseguire query |
PDOStatement::execute() | Eseguire query preparata |
PDOStatement::fetch() | Recuperare risultati |
Pool di connessioni PDO
Pool di connessioni trasparente per PDO tramite integrazione con Async\Pool. Ogni coroutine riceve la propria connessione dal pool con gestione automatica del ciclo di vita.
MySQLi
| Funzione | Descrizione |
|---|
mysqli_connect() | Connessione non-bloccante |
mysqli_query() | Eseguire query |
mysqli_prepare() | Preparare query |
mysqli_stmt_execute() | Eseguire query preparata |
mysqli_fetch_*() | Recuperare risultati |
PostgreSQL (nativo)
| Funzione | Descrizione |
|---|
pg_connect() | Connessione non-bloccante |
pg_query() | Eseguire query |
pg_prepare() | Preparare query |
pg_execute() | Eseguire query preparata |
pg_fetch_*() | Recuperare risultati |
Ogni contesto async utilizza una connessione separata per una concorrenza sicura.
CURL
| Funzione | Descrizione |
|---|
curl_exec() | Eseguire richiesta |
curl_multi_exec() | Eseguire più richieste |
curl_multi_select() | Attendere attività |
curl_multi_getcontent() | Ottenere contenuto |
curl_setopt() | Impostare opzioni |
curl_getinfo() | Ottenere info richiesta |
curl_error() | Ottenere errore |
curl_close() | Chiudere handle |
Socket
| Funzione | Descrizione |
|---|
socket_create() | Creare socket |
socket_create_pair() | Creare coppia di socket |
socket_connect() | Connettere |
socket_accept() | Accettare connessione |
socket_read() | Leggere dati |
socket_write() | Scrivere dati |
socket_send() | Inviare dati |
socket_recv() | Ricevere dati |
socket_sendto() | Inviare a indirizzo |
socket_recvfrom() | Ricevere da indirizzo |
socket_bind() | Associare a indirizzo |
socket_listen() | Ascoltare |
socket_select() | Monitorare attività socket |
I/O file e flussi
| Funzione | Descrizione |
|---|
fopen() | Aprire file |
fclose() | Chiudere file |
fread() | Leggere da file |
fwrite() | Scrivere su file |
fgets() | Leggere riga |
fgetc() | Leggere carattere |
fgetcsv() | Leggere riga CSV |
fputcsv() | Scrivere riga CSV |
fseek() | Impostare posizione |
ftell() | Ottenere posizione |
rewind() | Reimpostare posizione |
ftruncate() | Troncare file |
fflush() | Svuotare buffer |
fscanf() | Lettura formattata |
file_get_contents() | Leggere file intero |
file_put_contents() | Scrivere file intero |
file() | Leggere file in array |
copy() | Copiare file |
tmpfile() | Creare file temporaneo |
readfile() | Mostrare file |
fpassthru() | Mostrare resto del file |
stream_get_contents() | Leggere resto del flusso |
stream_copy_to_stream() | Copiare tra flussi |
flock() | Blocco file (tramite pool di thread) |
Importante: flock() utilizza il pool di thread. La funzione flock() è una chiamata di sistema bloccante che non può essere resa non-bloccante tramite eventi I/O di libuv. Dentro una coroutine, le operazioni di blocco (LOCK_SH, LOCK_EX) vengono scaricate al pool di thread libuv, permettendo alle altre coroutine di continuare l'esecuzione durante l'attesa del blocco. I blocchi non-bloccanti (LOCK_NB) e gli sblocchi (LOCK_UN) vengono eseguiti direttamente senza il pool di thread.
Importante: Timeout per file e flussi pipe. PHP non supporta nativamente i timeout per le operazioni di lettura/scrittura su file e flussi pipe — le funzioni standard fread(), fwrite() e altre possono bloccarsi indefinitamente. TrueAsync risolve questo problema: se per un flusso è impostato un timeout (tramite stream_set_timeout()), l'operazione di lettura registra contemporaneamente un evento IO e un timer. Se il timer scatta prima del completamento dell'IO, la lettura viene annullata e la coroutine riceve un risultato di -1 (indicatore di timeout). Questo funziona solo all'interno delle coroutine — al di fuori, il comportamento rimane standard.
Socket di flusso
| Funzione | Descrizione |
|---|
stream_socket_client() | Creare connessione client |
stream_socket_server() | Creare socket server |
stream_socket_accept() | Accettare connessione |
stream_select() | Monitorare attività dei flussi |
stream_context_create() | Creare contesto async |
Limitazione: stream_select() con flussi pipe (es. da proc_open()) non è supportato su Windows. Su Linux/macOS funziona nativamente tramite il ciclo di eventi.
Esecuzione di processi
| Funzione | Descrizione |
|---|
proc_open() | Aprire processo con pipe |
proc_close() | Chiudere processo |
exec() | Eseguire comando esterno |
shell_exec() | Eseguire comando shell |
system() | Eseguire comando di sistema |
passthru() | Eseguire con output diretto |
Importante: proc_close() e pclose() bloccano la coroutine. La chiamata a proc_close() o pclose() attende la terminazione del processo figlio. All'interno di una coroutine, questo blocca la coroutine corrente fino all'uscita del processo — le altre coroutine continuano a funzionare. Lo stesso accade con le chiamate implicite tramite i distruttori: se una variabile con una risorsa di processo esce dallo scope o viene distrutta dal garbage collector, il distruttore chiama pclose(), che blocca la coroutine in cui è in esecuzione la garbage collection.
Raccomandazione: chiudete sempre i processi esplicitamente tramite proc_close() anziché affidarvi ai distruttori, per controllare quale coroutine verrà bloccata.
Timer e ritardi
| Funzione | Descrizione |
|---|
sleep() | Ritardo in secondi |
usleep() | Ritardo in microsecondi |
time_nanosleep() | Ritardo con precisione al nanosecondo |
time_sleep_until() | Attendere fino al timestamp |
Buffer di output
Ogni coroutine riceve un buffer di output isolato.
| Funzione | Descrizione |
|---|
ob_start() | Avviare il buffering |
ob_flush() | Svuotare il buffer |
ob_clean() | Pulire il buffer |
ob_get_contents() | Ottenere il contenuto del buffer |
ob_end_clean() | Terminare il buffering |
Non ancora supportato
Funzioni pianificate per l'implementazione o non ancora adattate.
DNS
| Funzione | Descrizione |
|---|
dns_check_record() / checkdnsrr() | Verificare record DNS |
dns_get_mx() / getmxrr() | Ottenere record MX |
dns_get_record() | Ottenere record DNS |
Database
| Estensione | Descrizione |
|---|
| PDO ODBC | Driver ODBC |
| PDO Oracle | Driver Oracle |
| PDO SQLite | Driver SQLite |
| PDO Firebird | Driver Firebird |
| MongoDB | Client MongoDB |
| Funzione | Descrizione |
|---|
opendir() / readdir() / closedir() | Attraversamento directory |
unlink() / rename() | Eliminazione e rinomina file |
mkdir() / rmdir() | Creazione e rimozione directory |
stat() / lstat() | Informazioni sui file |
readlink() | Lettura dei link simbolici |
Nota: Le operazioni sui metadati dei file su disco locale si completano in microsecondi. La loro asincronia ha senso solo per i file system di rete (NFS).
E poi?