Verzeichnisstruktur phpBB-3.3.16


Veröffentlicht
27.04.2026

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

Stream.php

Zuletzt modifiziert: 01.05.2026, 11:26 - Dateigröße: 6.65 KiB


 001  <?php
 002   
 003  namespace GuzzleHttp\Psr7;
 004   
 005  use Psr\Http\Message\StreamInterface;
 006   
 007  /**
 008   * PHP stream implementation.
 009   *
 010   * @var $stream
 011   */
 012  class Stream implements StreamInterface
 013  {
 014      /**
 015       * Resource modes.
 016       *
 017       * @var string
 018       *
 019       * @see http://php.net/manual/function.fopen.php
 020       * @see http://php.net/manual/en/function.gzopen.php
 021       */
 022      const READABLE_MODES = '/r|a\+|ab\+|w\+|wb\+|x\+|xb\+|c\+|cb\+/';
 023      const WRITABLE_MODES = '/a|w|r\+|rb\+|rw|x|c/';
 024   
 025      private $stream;
 026      private $size;
 027      private $seekable;
 028      private $readable;
 029      private $writable;
 030      private $uri;
 031      private $customMetadata;
 032   
 033      /**
 034       * This constructor accepts an associative array of options.
 035       *
 036       * - size: (int) If a read stream would otherwise have an indeterminate
 037       *   size, but the size is known due to foreknowledge, then you can
 038       *   provide that size, in bytes.
 039       * - metadata: (array) Any additional metadata to return when the metadata
 040       *   of the stream is accessed.
 041       *
 042       * @param resource $stream  Stream resource to wrap.
 043       * @param array    $options Associative array of options.
 044       *
 045       * @throws \InvalidArgumentException if the stream is not a stream resource
 046       */
 047      public function __construct($stream, $options = [])
 048      {
 049          if (!is_resource($stream)) {
 050              throw new \InvalidArgumentException('Stream must be a resource');
 051          }
 052   
 053          if (isset($options['size'])) {
 054              $this->size = $options['size'];
 055          }
 056   
 057          $this->customMetadata = isset($options['metadata'])
 058              ? $options['metadata']
 059              : [];
 060   
 061          $this->stream = $stream;
 062          $meta = stream_get_meta_data($this->stream);
 063          $this->seekable = $meta['seekable'];
 064          $this->readable = (bool)preg_match(self::READABLE_MODES, $meta['mode']);
 065          $this->writable = (bool)preg_match(self::WRITABLE_MODES, $meta['mode']);
 066          $this->uri = $this->getMetadata('uri');
 067      }
 068   
 069      /**
 070       * Closes the stream when the destructed
 071       */
 072      public function __destruct()
 073      {
 074          $this->close();
 075      }
 076   
 077      public function __toString()
 078      {
 079          try {
 080              if ($this->isSeekable()) {
 081                  $this->seek(0);
 082              }
 083              return $this->getContents();
 084          } catch (\Exception $e) {
 085              return '';
 086          }
 087      }
 088   
 089      public function getContents()
 090      {
 091          if (!isset($this->stream)) {
 092              throw new \RuntimeException('Stream is detached');
 093          }
 094   
 095          $contents = stream_get_contents($this->stream);
 096   
 097          if ($contents === false) {
 098              throw new \RuntimeException('Unable to read stream contents');
 099          }
 100   
 101          return $contents;
 102      }
 103   
 104      public function close()
 105      {
 106          if (isset($this->stream)) {
 107              if (is_resource($this->stream)) {
 108                  fclose($this->stream);
 109              }
 110              $this->detach();
 111          }
 112      }
 113   
 114      public function detach()
 115      {
 116          if (!isset($this->stream)) {
 117              return null;
 118          }
 119   
 120          $result = $this->stream;
 121          unset($this->stream);
 122          $this->size = $this->uri = null;
 123          $this->readable = $this->writable = $this->seekable = false;
 124   
 125          return $result;
 126      }
 127   
 128      public function getSize()
 129      {
 130          if ($this->size !== null) {
 131              return $this->size;
 132          }
 133   
 134          if (!isset($this->stream)) {
 135              return null;
 136          }
 137   
 138          // Clear the stat cache if the stream has a URI
 139          if ($this->uri) {
 140              clearstatcache(true, $this->uri);
 141          }
 142   
 143          $stats = fstat($this->stream);
 144          if (isset($stats['size'])) {
 145              $this->size = $stats['size'];
 146              return $this->size;
 147          }
 148   
 149          return null;
 150      }
 151   
 152      public function isReadable()
 153      {
 154          return $this->readable;
 155      }
 156   
 157      public function isWritable()
 158      {
 159          return $this->writable;
 160      }
 161   
 162      public function isSeekable()
 163      {
 164          return $this->seekable;
 165      }
 166   
 167      public function eof()
 168      {
 169          if (!isset($this->stream)) {
 170              throw new \RuntimeException('Stream is detached');
 171          }
 172   
 173          return feof($this->stream);
 174      }
 175   
 176      public function tell()
 177      {
 178          if (!isset($this->stream)) {
 179              throw new \RuntimeException('Stream is detached');
 180          }
 181   
 182          $result = ftell($this->stream);
 183   
 184          if ($result === false) {
 185              throw new \RuntimeException('Unable to determine stream position');
 186          }
 187   
 188          return $result;
 189      }
 190   
 191      public function rewind()
 192      {
 193          $this->seek(0);
 194      }
 195   
 196      public function seek($offset, $whence = SEEK_SET)
 197      {
 198          $whence = (int) $whence;
 199   
 200          if (!isset($this->stream)) {
 201              throw new \RuntimeException('Stream is detached');
 202          }
 203          if (!$this->seekable) {
 204              throw new \RuntimeException('Stream is not seekable');
 205          }
 206          if (fseek($this->stream, $offset, $whence) === -1) {
 207              throw new \RuntimeException('Unable to seek to stream position '
 208                  . $offset . ' with whence ' . var_export($whence, true));
 209          }
 210      }
 211   
 212      public function read($length)
 213      {
 214          if (!isset($this->stream)) {
 215              throw new \RuntimeException('Stream is detached');
 216          }
 217          if (!$this->readable) {
 218              throw new \RuntimeException('Cannot read from non-readable stream');
 219          }
 220          if ($length < 0) {
 221              throw new \RuntimeException('Length parameter cannot be negative');
 222          }
 223   
 224          if (0 === $length) {
 225              return '';
 226          }
 227   
 228          $string = fread($this->stream, $length);
 229          if (false === $string) {
 230              throw new \RuntimeException('Unable to read from stream');
 231          }
 232   
 233          return $string;
 234      }
 235   
 236      public function write($string)
 237      {
 238          if (!isset($this->stream)) {
 239              throw new \RuntimeException('Stream is detached');
 240          }
 241          if (!$this->writable) {
 242              throw new \RuntimeException('Cannot write to a non-writable stream');
 243          }
 244   
 245          // We can't know the size after writing anything
 246          $this->size = null;
 247          $result = fwrite($this->stream, $string);
 248   
 249          if ($result === false) {
 250              throw new \RuntimeException('Unable to write to stream');
 251          }
 252   
 253          return $result;
 254      }
 255   
 256      public function getMetadata($key = null)
 257      {
 258          if (!isset($this->stream)) {
 259              return $key ? null : [];
 260          } elseif (!$key) {
 261              return $this->customMetadata + stream_get_meta_data($this->stream);
 262          } elseif (isset($this->customMetadata[$key])) {
 263              return $this->customMetadata[$key];
 264          }
 265   
 266          $meta = stream_get_meta_data($this->stream);
 267   
 268          return isset($meta[$key]) ? $meta[$key] : null;
 269      }
 270  }
 271