Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

CachingStream.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 3.71 KiB


 001  <?php
 002  namespace GuzzleHttp\Stream;
 003   
 004  use GuzzleHttp\Stream\Exception\SeekException;
 005   
 006  /**
 007   * Stream decorator that can cache previously read bytes from a sequentially
 008   * read stream.
 009   */
 010  class CachingStream implements StreamInterface
 011  {
 012      use StreamDecoratorTrait;
 013   
 014      /** @var StreamInterface Stream being wrapped */
 015      private $remoteStream;
 016   
 017      /** @var int Number of bytes to skip reading due to a write on the buffer */
 018      private $skipReadBytes = 0;
 019   
 020      /**
 021       * We will treat the buffer object as the body of the stream
 022       *
 023       * @param StreamInterface $stream Stream to cache
 024       * @param StreamInterface $target Optionally specify where data is cached
 025       */
 026      public function __construct(
 027          StreamInterface $stream,
 028          StreamInterface $target = null
 029      ) {
 030          $this->remoteStream = $stream;
 031          $this->stream = $target ?: new Stream(fopen('php://temp', 'r+'));
 032      }
 033   
 034      public function getSize()
 035      {
 036          return max($this->stream->getSize(), $this->remoteStream->getSize());
 037      }
 038   
 039      /**
 040       * {@inheritdoc}
 041       * @throws SeekException When seeking with SEEK_END or when seeking
 042       *     past the total size of the buffer stream
 043       */
 044      public function seek($offset, $whence = SEEK_SET)
 045      {
 046          if ($whence == SEEK_SET) {
 047              $byte = $offset;
 048          } elseif ($whence == SEEK_CUR) {
 049              $byte = $offset + $this->tell();
 050          } else {
 051              return false;
 052          }
 053   
 054          // You cannot skip ahead past where you've read from the remote stream
 055          if ($byte > $this->stream->getSize()) {
 056              throw new SeekException(
 057                  $this,
 058                  $byte,
 059                  sprintf('Cannot seek to byte %d when the buffered stream only'
 060                      . ' contains %d bytes', $byte, $this->stream->getSize())
 061              );
 062          }
 063   
 064          return $this->stream->seek($byte);
 065      }
 066   
 067      public function read($length)
 068      {
 069          // Perform a regular read on any previously read data from the buffer
 070          $data = $this->stream->read($length);
 071          $remaining = $length - strlen($data);
 072   
 073          // More data was requested so read from the remote stream
 074          if ($remaining) {
 075              // If data was written to the buffer in a position that would have
 076              // been filled from the remote stream, then we must skip bytes on
 077              // the remote stream to emulate overwriting bytes from that
 078              // position. This mimics the behavior of other PHP stream wrappers.
 079              $remoteData = $this->remoteStream->read(
 080                  $remaining + $this->skipReadBytes
 081              );
 082   
 083              if ($this->skipReadBytes) {
 084                  $len = strlen($remoteData);
 085                  $remoteData = substr($remoteData, $this->skipReadBytes);
 086                  $this->skipReadBytes = max(0, $this->skipReadBytes - $len);
 087              }
 088   
 089              $data .= $remoteData;
 090              $this->stream->write($remoteData);
 091          }
 092   
 093          return $data;
 094      }
 095   
 096      public function write($string)
 097      {
 098          // When appending to the end of the currently read stream, you'll want
 099          // to skip bytes from being read from the remote stream to emulate
 100          // other stream wrappers. Basically replacing bytes of data of a fixed
 101          // length.
 102          $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell();
 103          if ($overflow > 0) {
 104              $this->skipReadBytes += $overflow;
 105          }
 106   
 107          return $this->stream->write($string);
 108      }
 109   
 110      public function eof()
 111      {
 112          return $this->stream->eof() && $this->remoteStream->eof();
 113      }
 114   
 115      /**
 116       * Close both the remote stream and buffer stream
 117       */
 118      public function close()
 119      {
 120          $this->remoteStream->close() && $this->stream->close();
 121      }
 122  }
 123