Skip to content

Instantly share code, notes, and snippets.

@sasezaki
Last active August 29, 2015 14:07
Show Gist options
  • Save sasezaki/9cae96273e0ce6384a7b to your computer and use it in GitHub Desktop.
Save sasezaki/9cae96273e0ce6384a7b to your computer and use it in GitHub Desktop.
example of stream wrappers
<?php
// a fork of http://php.net/manual/ja/stream.streamwrapper.example-1.php
class VariableStream {
var $position;
var $varname;
function stream_open($path, $mode, $options, &$opened_path)
{
//$url = parse_url($path);
//$this->varname = $url["host"];
$this->varname = $path;
$this->position = 0;
return true;
}
function stream_read($count)
{
$ret = substr($GLOBALS[$this->varname], $this->position, $count);
$this->position += strlen($ret);
return $ret;
}
function stream_write($data)
{
$left = substr($GLOBALS[$this->varname], 0, $this->position);
$right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
$GLOBALS[$this->varname] = $left . $data . $right;
$this->position += strlen($data);
return strlen($data);
}
function stream_tell()
{
return $this->position;
}
function stream_eof()
{
return $this->position >= strlen($GLOBALS[$this->varname]);
}
function stream_seek($offset, $whence)
{
switch ($whence) {
case SEEK_SET:
if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
$this->position = $offset;
return true;
} else {
return false;
}
break;
case SEEK_CUR:
if ($offset >= 0) {
$this->position += $offset;
return true;
} else {
return false;
}
break;
case SEEK_END:
if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
$this->position = strlen($GLOBALS[$this->varname]) + $offset;
return true;
} else {
return false;
}
break;
default:
return false;
}
}
function stream_metadata($path, $option, $var)
{
if($option == STREAM_META_TOUCH) {
$url = parse_url($path);
$varname = $url["host"];
if(!isset($GLOBALS[$varname])) {
$GLOBALS[$varname] = '';
}
return true;
}
return false;
}
function stream_stat()
{
return [];
}
}
stream_wrapper_unregister('file');
stream_wrapper_register("file", "VariableStream");
$varname = 'tmp.txt';
$$varname = 'aaa';
echo file_get_contents("tmp.txt"); //aaa
<?php
use Vfs\FileSystem;
use Vfs\Node\Directory;
use Vfs\Node\File;
require_once __DIR__.'/vendor/autoload.php';
stream_wrapper_unregister('http');
$fs = FileSystem::factory('http');
$dir = new Directory(['tmp.txt' => new File('Hello')]);
$fs->get('/')->add('example.com', $dir);
echo file_get_contents('http://example.com/tmp.txt'); // Hello
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment