strlen(self::$stream_content)]; } public function stream_tell() { return self::$position; } public function stream_eof() { return self::$position >= strlen(self::$stream_content); } public function url_stat() { return ['size' => strlen(self::$stream_content)]; } public function stream_seek($offset, $whence) { switch ($whence) { case SEEK_SET: if ($offset < strlen(self::$stream_content) && $offset >= 0) { self::$position = $offset; return true; } else { return false; } break; case SEEK_CUR: if ($offset >= 0) { self::$position += $offset; return true; } else { return false; } break; case SEEK_END: if (strlen(self::$stream_content) + $offset >= 0) { self::$position = strlen(self::$stream_content) + $offset; return true; } else { return false; } break; default: return false; } } public function stream_lock($operation) { return true; } public function stream_metadata() { return false; } }