Description
bool stream_wrapper_register
( string $protocol
, string $classname
)
To implement a wrapper, you need to define a class with a number of
member functions, as defined below. When someone fopens your stream,
PHP will create an instance of classname
and
then call methods on that instance. You must implement the methods
exactly as described below - doing otherwise will lead to undefined
behaviour.
Note:
As of PHP 5.0.0 the instance of
classname
will be populated with a
context
property referencing a
Context Resource which may be accessed
with stream_context_get_options().
If no context was passed to the stream creation function,
context
will be set to NULL.
stream_wrapper_register() will return FALSE if the
protocol
already has a handler.
bool stream_open
( string $path
, string $mode
, int $options
, string $opened_path
)
mode
is the mode used to open the file,
as detailed for fopen(). You are responsible
for checking that mode
is valid for the
path
requested.
options
holds additional flags set
by the streams API. It can hold one or more of the following
values OR'd together.
If the path
is opened successfully,
and STREAM_USE_PATH is set in options
,
you should set opened_path
to the full
path of the file/resource that was actually opened.
If the requested resource was opened successfully, you should
return TRUE, otherwise you should return FALSE
void stream_close
( void
)
string stream_read
( int $count
)
int stream_write
( string $data
)
bool stream_eof
( void
)
int stream_tell
( void
)
bool stream_seek
( int $offset
, int $whence
)
bool stream_flush
( void
)
array stream_stat
( void
)
Note:
Userspace wrapper unlink method is not supported prior to
PHP 5.0.0.
bool rename
(
string $path_from
,
string $path_to
)
Note:
Userspace wrapper rename method is not supported prior to
PHP 5.0.0.
bool mkdir
(
string $path
,
int $mode
,
int $options
)
Note:
Userspace wrapper mkdir method is not supported prior to
PHP 5.0.0.
bool rmdir
(
string $path
,
int $options
)
Note:
Userspace wrapper rmdir method is not supported prior to
PHP 5.0.0.
bool dir_opendir
( string $path
, int $options
)
array url_stat
( string $path
, int $flags
)
flags
holds additional flags set
by the streams API. It can hold one or more of the following
values OR'd together.
string dir_readdir
( void
)
bool dir_rewinddir
( void
)
bool dir_closedir
( void
)
The example below implements a var:// protocol handler that
allows read/write access to a named global variable using
standard filesystem stream functions such as fread().
The var:// protocol implemented below, given the URL
"var://foo" will read/write data to/from $GLOBALS["foo"].
Example #1 A Stream for reading/writing global variables
<?php
class VariableStream {
var $position;
var $varname;
function stream_open($path, $mode, $options, &$opened_path)
{
$url = parse_url($path);
$this->varname = $url["host"];
$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;
}
}
}
stream_wrapper_register("var", "VariableStream")
or die("Failed to register protocol");
$myvar = "";
$fp = fopen("var://myvar", "r+");
fwrite($fp, "line1\n");
fwrite($fp, "line2\n");
fwrite($fp, "line3\n");
rewind($fp);
while (!feof($fp)) {
echo fgets($fp);
}
fclose($fp);
var_dump($myvar);
?>