Server->sendfile

发送文件到TCP客户端连接。使用示例:

bool Server->sendfile(int $fd, string $filename, int $offset =0, int $length = 0);
  • sendfile函数调用操作系统提供的sendfile系统调用,由操作系统直接读取文件并写入socket
  • 因此sendfile只有2次内存拷贝,使用此函数可以降低发送大量文件时操作系统的CPU和内存占用

参数

  • $filename 要发送的文件路径,如果文件不存在会返回false
  • $offset 指定文件偏移量,可以从文件的某个位置起发送数据。默认为0,表示从文件头部开始发送
  • $length 指定发送的长度,默认为文件尺寸。

返回值

  • 操作成功返回true,失败返回false

此函数与Server->send都是向客户端发送数据,不同的是sendfile的数据来自于指定的文件
sendfile在低于1.9.17版本中不能用于SSL客户端连接
$length$offset1.9.11版本后可用


  • 陈晓生

       if(strlen($send_data)>=2*1024*1024){
            $tmp_file = tempnam('/dev/shm/swoole', 'send_');
            file_put_contents($tmp_file, $send_data);
            $this->serv->sendfile($this->currentFd,$tmp_file);
        }else{
            return $this->serv->send($this->currentFd, $send_data);
            // $this->serv->close($this->currentFd);
        }
    

    这样子进程会退出

    $tmp_file = tempnam('/dev/shm/swoole', 'send_'); file_put_contents($tmp_file, $send_data); $this->serv->sendfile($this->currentFd,$tmp_file);

    直接这样就不会,奇怪

  • 盒子

    sendfile很吃CPU,有解决的办法吗, 10几个并发CPU就满了

  • ONE Take

    韩老师,我使用这个函数一直在浏览器报这个错误 text.html:12 WebSocket connection to 'ws://10.8.0.82:9501/' failed: One or more reserved bits are on: reserved1 = 0, reserved2 = 1, reserved3 = 1 如何解决?

  • ONE Take

    我的环境是浏览器在windows10,swoole在vm中的centos7上,版本为最新版

  • ONE Take

    版本是4.0.2

  • ↘侵蚀の目光

    楼上的,这个是基于TCP的,不支持ws协议