\SwooleAsync

异步文件系统 IO https://wiki.swoole.com/wiki/page/183.html

Summary

Methods
Properties
Constants
readfile()
writeFile()
read()
write()
dnsLookup()
exec()
No public properties found
No constants found
No protected methods found
No protected properties found
N/A
No private methods found
No private properties found
N/A

Methods

readfile()

readfile(string  $filename, mixed  $callback) : boolean

异步读取文件内容,函数原型 文件不存在会返回false 成功打开文件立即返回true 数据读取完毕后会回调指定的callback函数。

swoole_async_readfile会将文件内容全部复制到内存,所以不能用于大文件的读取 如果要读取超大文件,请使用swoole_async_read函数 swoole_async_readfile最大可读取4M的文件,受限于SW_AIO_MAX_FILESIZE宏

swoole_async_readfile(DIR."/server.php", function($filename, $content) { echo "$filename: $content"; });

Parameters

string $filename
mixed $callback

Returns

boolean

writeFile()

writeFile(string  $filename, string  $fileContent, callable|null  $callback = null, integer  $flags) : boolean

异步写文件,调用此函数后会立即返回。当写入完成时会自动回调指定的callback函数。

参数1为文件的名称,必须有可写权限,文件不存在会自动创建。打开文件失败会立即返回false 参数2为要写入到文件的内容,最大可写入4M 参数3为写入成功后的回调函数,可选 参数4为写入的选项,可以使用FILE_APPEND表示追加到文件末尾

FILE_APPEND在1.9.1或更高版本可用 Linux原生异步IO不支持FILE_APPEND,并且写入的内容长度必须为4096的整数倍,否则底层会自动在末尾填充0

Parameters

string $filename
string $fileContent
callable|null $callback
integer $flags

Returns

boolean

read()

read(string  $filename, mixed  $callback, integer  $size = 8192, integer  $offset) : boolean

异步读文件,使用此函数读取文件是非阻塞的,当读操作完成时会自动回调指定的函数。

此函数与swoole_async_readfile不同,它是分段读取,可以用于读取超大文件。每次只读$size个字节,不会占用太多内存。 在读完后会自动回调$callback函数,回调函数接受2个参数: bool callback(string $filename, string $content); $filename,文件名称 $content,读取到的分段内容,如果内容为空,表明文件已读完 $offset参数在1.7.13以上版本可用 $callback函数,可以通过return true/false,来控制是否继续读下一段内容。 return true,继续读取 return false,停止读取并关闭文件

Parameters

string $filename
mixed $callback
integer $size
integer $offset

Returns

boolean

write()

write(string  $filename, string  $content, integer  $offset = -1, mixed|NULL  $callback = NULL) : boolean

异步写文件,与swoole_async_writefile不同,swoole_async_write是分段写的。不需要一次性将要写的内容放到内存里,所以只占用少量内存。swoole_async_write通过传入的offset参数来确定写入的位置。

当offset为-1时表示追加写入到文件的末尾 Linux原生异步IO不支持追加模式,并且$content的长度和$offset必须为512的整数倍。如果传入错误的字符串长度或者$offset写入会失败,并且错误码为EINVAL

Parameters

string $filename
string $content
integer $offset
mixed|NULL $callback

Returns

boolean

dnsLookup()

dnsLookup(string  $domain, mixed  $callback) 

将域名解析为IP地址。调用此函数是非阻塞的,调用会立即返回。将向下执行后面的代码。

当DNS查询完成时,自动回调指定的callback函数。 当DNS查询失败时,比如域名不存在,回调函数传入的$ip为空 swoole_async_dns_lookup("www.baidu.com", function($host, $ip){ echo "{$host} : {$ip}\n"; });

关闭DNS缓存 swoole_async_set(array( 'disable_dns_cache' => true, ));

DNS随机 swoole_async_set(array( 'dns_lookup_random' => true, ));

指定DNS服务器 swoole_async_set(array( 'dns_server' => '114.114.114.114', ));

Parameters

string $domain
mixed $callback

exec()

exec(string  $command, callable  $callback) 

异步执行Shell命令。相当于shell_exec函数,执行后底层会fork一个子进程,并执行对应的command命令。

$command为执行的终端指令,如ls 执行成功后返回子进程的PID 命令执行完毕子进程退出后会回调指定的$callback函数,回调函数接收2个参数,第一个参数为命令执行后的屏幕输出内容$result,第二个参数为进程退出的状态信息$status

注意事项 fork创建子进程的操作代价是非常昂贵的,系统无法支撑过大的并发量 使用exec时,请勿使用pcntl_signal或swoole_process::signal注册SIGCHLD函数,执行wait操作,否则在命令回调函数中,状态信息$status将为false 此函数在1.9.22或更高版本可用

使用实例 $pid = Swoole\Async::exec("ps aux", function ($result, $status) { var_dump(strlen($result), $status); }); var_dump($pid);

Parameters

string $command
callable $callback