Підтримувані функції
TrueAsync адаптує 70+ стандартних PHP функцій для неблокуючої роботи в контексті корутин. Усі перелічені функції автоматично стають асинхронними при виклику всередині корутини. Поза корутиною вони працюють як зазвичай.
DNS
| Функція | Опис |
|---|
gethostbyname() | Розв'язання імені хоста в IP-адресу |
gethostbyaddr() | Зворотне розв'язання IP-адреси в ім'я хоста |
gethostbynamel() | Отримання списку IP-адрес для імені хоста |
Бази даних
PDO MySQL
| Функція | Опис |
|---|
PDO::__construct() | Неблокуюче підключення |
PDO::prepare() | Підготовка запиту |
PDO::exec() | Виконання запиту |
PDOStatement::execute() | Виконання підготовленого запиту |
PDOStatement::fetch() | Отримання результатів |
PDO PgSQL
| Функція | Опис |
|---|
PDO::__construct() | Неблокуюче підключення |
PDO::prepare() | Підготовка запиту |
PDO::exec() | Виконання запиту |
PDOStatement::execute() | Виконання підготовленого запиту |
PDOStatement::fetch() | Отримання результатів |
Пул з'єднань PDO
Прозорий пул з'єднань для PDO через інтеграцію з Async\Pool. Кожна корутина отримує власне з'єднання з пулу з автоматичним керуванням життєвим циклом.
MySQLi
| Функція | Опис |
|---|
mysqli_connect() | Неблокуюче підключення |
mysqli_query() | Виконання запиту |
mysqli_prepare() | Підготовка запиту |
mysqli_stmt_execute() | Виконання підготовленого запиту |
mysqli_fetch_*() | Отримання результатів |
PostgreSQL (нативний)
| Функція | Опис |
|---|
pg_connect() | Неблокуюче підключення |
pg_query() | Виконання запиту |
pg_prepare() | Підготовка запиту |
pg_execute() | Виконання підготовленого запиту |
pg_fetch_*() | Отримання результатів |
Кожен async-контекст використовує окреме з'єднання для безпечної конкурентності.
CURL
| Функція | Опис |
|---|
curl_exec() | Виконання запиту |
curl_multi_exec() | Виконання кількох запитів |
curl_multi_select() | Очікування активності |
curl_multi_getcontent() | Отримання вмісту |
curl_setopt() | Встановлення параметрів |
curl_getinfo() | Отримання інформації про запит |
curl_error() | Отримання помилки |
curl_close() | Закриття дескриптора |
Сокети
| Функція | Опис |
|---|
socket_create() | Створення сокета |
socket_create_pair() | Створення пари сокетів |
socket_connect() | Підключення |
socket_accept() | Прийняття з'єднання |
socket_read() | Читання даних |
socket_write() | Запис даних |
socket_send() | Відправка даних |
socket_recv() | Отримання даних |
socket_sendto() | Відправка за адресою |
socket_recvfrom() | Отримання за адресою |
socket_bind() | Прив'язка до адреси |
socket_listen() | Прослуховування |
socket_select() | Моніторинг активності сокетів |
Файловий та потоковий ввід-вивід
| Функція | Опис |
|---|
fopen() | Відкриття файлу |
fclose() | Закриття файлу |
fread() | Читання з файлу |
fwrite() | Запис у файл |
fgets() | Читання рядка |
fgetc() | Читання символу |
fgetcsv() | Читання CSV-рядка |
fputcsv() | Запис CSV-рядка |
fseek() | Встановлення позиції |
ftell() | Отримання позиції |
rewind() | Скидання позиції |
ftruncate() | Обрізка файлу |
fflush() | Скидання буферів |
fscanf() | Форматоване читання |
file_get_contents() | Читання всього файлу |
file_put_contents() | Запис всього файлу |
file() | Читання файлу в масив |
copy() | Копіювання файлу |
tmpfile() | Створення тимчасового файлу |
readfile() | Виведення файлу |
fpassthru() | Виведення залишку файлу |
stream_get_contents() | Читання залишку потоку |
stream_copy_to_stream() | Копіювання між потоками |
flock() | Блокування файлів (через пул потоків) |
Важливо: flock() використовує пул потоків. Функція flock() — блокуючий системний виклик, який неможливо зробити неблокуючим через I/O-події libuv. Всередині корутини блокуючі операції (LOCK_SH, LOCK_EX) виконуються у пулі потоків libuv, дозволяючи іншим корутинам продовжувати роботу під час очікування блокування. Неблокуючі блокування (LOCK_NB) та розблокування (LOCK_UN) виконуються напряму без пулу потоків.
Важливо: таймаути для файлів та pipe-потоків. PHP не підтримує таймаути для операцій читання/запису файлів та pipe-потоків — стандартні fread(), fwrite() та інші функції можуть блокуватися нескінченно. TrueAsync вирішує цю проблему: якщо для потоку встановлено таймаут (через stream_set_timeout()), операція читання реєструє одночасно IO-подію та таймер. Якщо таймер спрацьовує раніше завершення IO — читання скасовується, і корутина отримує результат -1 (ознака таймауту). Це працює лише всередині корутин — поза корутинами поведінка залишається стандартною.
Потокові сокети
| Функція | Опис |
|---|
stream_socket_client() | Створення клієнтського з'єднання |
stream_socket_server() | Створення серверного сокета |
stream_socket_accept() | Прийняття з'єднання |
stream_select() | Моніторинг активності потоків |
stream_context_create() | Створення контексту з підтримкою async |
Обмеження: stream_select() з pipe-потоками (наприклад, від proc_open()) не підтримується у Windows. На Linux/macOS працює через event loop.
Запуск процесів
| Функція | Опис |
|---|
proc_open() | Відкриття процесу з pipe-каналами |
proc_close() | Закриття процесу |
exec() | Виконання зовнішньої команди |
shell_exec() | Виконання команди через оболонку |
system() | Виконання системної команди |
passthru() | Виконання з прямим виведенням |
Важливо: proc_close() та pclose() блокують корутину. Виклик proc_close() або pclose() очікує завершення дочірнього процесу. Всередині корутини це блокує поточну корутину до виходу процесу — інші корутини продовжують працювати. Те саме відбувається при неявному виклику через деструктор: якщо змінна з ресурсом процесу виходить з області видимості або знищується збирачем сміття, деструктор викликає pclose(), що блокує корутину, в якій виконується збирання сміття.
Рекомендація: завжди явно закривайте процеси через proc_close(), не покладаючись на деструктор, щоб контролювати, в якій корутині відбудеться блокування.
Таймери та затримки
| Функція | Опис |
|---|
sleep() | Затримка в секундах |
usleep() | Затримка в мікросекундах |
time_nanosleep() | Затримка з наносекундною точністю |
time_sleep_until() | Очікування до вказаного часу |
Буферизація виведення
Кожна корутина отримує ізольований буфер виведення.
| Функція | Опис |
|---|
ob_start() | Початок буферизації |
ob_flush() | Скидання буфера |
ob_clean() | Очищення буфера |
ob_get_contents() | Отримання вмісту буфера |
ob_end_clean() | Завершення буферизації |
Ще не підтримується
Функції, що заплановані до реалізації або ще не адаптовані.
DNS
| Функція | Опис |
|---|
dns_check_record() / checkdnsrr() | Перевірка DNS-запису |
dns_get_mx() / getmxrr() | Отримання MX-записів |
dns_get_record() | Отримання DNS-записів довільного типу |
Бази даних
| Розширення | Опис |
|---|
| PDO ODBC | Драйвер ODBC |
| PDO Oracle | Драйвер Oracle |
| PDO SQLite | Драйвер SQLite |
| PDO Firebird | Драйвер Firebird |
| MongoDB | Клієнт MongoDB |
Файлові операції (метадані)
| Функція | Опис |
|---|
opendir() / readdir() / closedir() | Робота з каталогами |
unlink() / rename() | Видалення та перейменування файлів |
mkdir() / rmdir() | Створення та видалення каталогів |
stat() / lstat() | Інформація про файли |
readlink() | Читання символічних посилань |
Примітка: Файлові операції з метаданими на локальному диску виконуються за мікросекунди. Їх асинхронність має сенс лише при роботі з мережевими файловими системами (NFS).
Що далі?