支持的函数

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 连接池

通过 Async\Pool 集成实现透明的 PDO 连接池。 每个协程从池中获取自己的连接,自动管理生命周期。

MySQLi

函数描述
mysqli_connect()非阻塞连接
mysqli_query()执行查询
mysqli_prepare()准备语句
mysqli_stmt_execute()执行预处理语句
mysqli_fetch_*()获取结果

PostgreSQL(原生)

函数描述
pg_connect()非阻塞连接
pg_query()执行查询
pg_prepare()准备语句
pg_execute()执行预处理语句
pg_fetch_*()获取结果

每个异步上下文使用独立连接以确保安全并发。


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()监控套接字活动

文件和流 I/O

函数描述
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() 函数是一个阻塞系统调用,无法通过 libuv I/O 事件实现非阻塞。 在协程内部,阻塞锁操作(LOCK_SHLOCK_EX)被卸载到 libuv 线程池,允许其他协程在等待锁时继续执行。 非阻塞锁(LOCK_NB)和解锁(LOCK_UN)直接执行,不使用线程池。

重要:文件和管道流的超时。 PHP 原生不支持文件和管道流读写操作的超时——标准的 fread()fwrite() 等函数可能会无限期阻塞。 TrueAsync 解决了这个问题:如果为流设置了超时(通过 stream_set_timeout()), 读取操作会同时注册一个 IO 事件和一个定时器。如果定时器在 IO 完成之前触发, 读取将被取消,协程收到返回值 -1(超时标志)。 此功能仅在协程内部有效——在协程外部,行为保持标准。


流套接字

函数描述
stream_socket_client()创建客户端连接
stream_socket_server()创建服务器套接字
stream_socket_accept()接受连接
stream_select()监控流活动
stream_context_create()创建异步上下文

限制: stream_select() 在 Windows 上不支持管道流(例如来自 proc_open())。在 Linux/macOS 上通过事件循环原生工作。


进程执行

函数描述
proc_open()打开带管道的进程
proc_close()关闭进程
exec()执行外部命令
shell_exec()执行 shell 命令
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 ODBCODBC 驱动
PDO OracleOracle 驱动
PDO SQLiteSQLite 驱动
PDO FirebirdFirebird 驱动
MongoDBMongoDB 客户端

文件操作(元数据)

函数描述
opendir() / readdir() / closedir()目录遍历
unlink() / rename()文件删除和重命名
mkdir() / rmdir()目录创建和删除
stat() / lstat()文件信息
readlink()读取符号链接

注意: 本地磁盘上的文件元数据操作在微秒内完成。只有在网络文件系统(NFS)上才有异步化的意义。


接下来?