示例#1
0
 protected function socketWriter($socket, Channel $channel, callable $transform = null) : \Generator
 {
     $writer = new SocketWriter($socket);
     $len = 0;
     try {
         while (null !== ($chunk = (yield $channel->receive()))) {
             $len += (yield $writer->write($transform ? $transform($chunk) : $chunk));
         }
         return $len;
     } catch (\Throwable $e) {
         $channel->close($e);
         throw $e;
     } finally {
         $writer->dispose();
     }
 }
示例#2
0
 protected function handleSendfile(string $path, $socket, int $length, int $offset) : \Generator
 {
     $stream = (yield $this->readStream($path, $offset));
     try {
         $writer = new SocketWriter($socket);
         $len = 0;
         try {
             while ($len < $length && null !== ($chunk = (yield $stream->read(\min(4096, $length - $len))))) {
                 $len += (yield $writer->write($chunk));
             }
             return $len;
         } finally {
             $writer->dispose();
         }
     } catch (\Throwable $e) {
         throw new FilesystemException(\sprintf('Failed to send file: "%s"', $path), 0, $e);
     } finally {
         $stream->close();
     }
 }