3v4l.org

run code in 300+ PHP versions simultaneously
<?php class File_stream { static $stream; protected $position; public $context; function stream_open ($path, $mode) { if ($mode != 'r' && $mode != 'rb') { return false; } $this->position = 0; return true; } function stream_read ($length) { fseek(self::$stream, $this->position); $bytes = fread(self::$stream, $length); $this->position += strlen($bytes); return $bytes; } function stream_tell () { return $this->position; } function stream_eof () { fseek(self::$stream, $this->position); return feof(self::$stream); } function stream_seek ($offset, $whence = SEEK_SET) { var_dump('seek', $this->position, $offset, $whence); fseek(self::$stream, $this->position); $result = fseek(self::$stream, $offset, $whence); $this->position = ftell(self::$stream); return $result === 0; } function stream_stat () { return fstat(self::$stream); } } stream_wrapper_register('request-file', 'File_stream'); $data = '0123456789abcdef'; $stream_direct = fopen('php://temp', 'w+b'); fwrite($stream_direct, $data); rewind($stream_direct); File_stream::$stream = $stream_direct; $stream = fopen('request-file://', 'r'); var_dump(fread($stream, 3)); var_dump(ftell($stream)); var_dump(fseek($stream, -1, SEEK_CUR)); var_dump(fread($stream, 2)); var_dump(ftell($stream)); fclose($stream);
Output for 8.0.1 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.6
string(3) "012" int(3) string(4) "seek" int(16) int(2) int(0) int(0) string(2) "23" int(4)

preferences:
106.15 ms | 402 KiB | 89 Q