swoole_server->sendfile
发送文件到TCP客户端连接。使用示例:
bool swoole_server->sendfile(int $fd, string $filename); $serv->sendfile($fd, __DIR__.'/test.jpg');
sendfile函数调用OS提供的sendfile系统调用,由操作系统直接读取文件并写入socket。sendfile只有2次内存拷贝,使用此函数可以降低发送大量文件时操作系统的CPU和内存占用。
- $filename 要发送的文件路径,如果文件不存在会返回false
- 操作成功返回true,失败返回false
例子:
<?php $serv = new swoole_server("0.0.0.0", 9501); $serv->set(array( 'worker_num' => 2, 'dispatch_mode' => 3, 'daemonize' => false, 'log_file' => '/tmp/swoole.log' )); $serv->on('start', function($serv) { echo 'start',PHP_EOL; }); $serv->on('workerStart', function($serv, $worker_id) { echo "server start\n"; }); $serv->on('connect', function ($serv, $fd, $from_id){ echo "[#".posix_getpid()."]\tClient@[$fd:$from_id]: Connect.\n"; $serv->send($fd, filesize(__DIR__.'/test.jpg')); }); $serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) { echo "[#".$serv->worker_id."]\tClient[$fd]: $data\n"; $serv->sendfile($fd, __DIR__.'/test.jpg'); //$serv->close($fd); }); $serv->on('close', function ($serv, $fd, $from_id) { echo "[#".posix_getpid()."]\tClient@[$fd:$from_id]: Close.\n"; }); $serv->start();
此函数与swoole_server->send都是向客户端发送数据,不同的是sendfile的数据来自于指定的文件。