Example of a stream for reading a string passed
via a context object.
<?php
class sfStreamStringRead
{
const PROTOCOL = 'stringread'; protected $dataPos = NULL;
protected $dataBuf = NULL;
protected $dataLen = NULL;
function stream_open($path, $mode, $options, &$opened_path)
{
$contextOptions = stream_context_get_options($this->context);
if (!isset($contextOptions[self::PROTOCOL]['data'])) {
return FALSE;
}
$this->dataBuf = $contextOptions[self::PROTOCOL]['data'];
$this->dataLen = strlen($this->dataBuf);
$this->dataPos = 0;
return TRUE;
}
function stream_read($count){
$ret = substr($this->dataBuf, $this->dataPos, $count);
$this->dataPos += strlen($ret);
return $ret;
}
function stream_eof(){
return $this->dataPos >= $this->dataLen;
}
function stream_tell(){
return $this->dataPos;
}
static function genURL()
{
return self::PROTOCOL . '://';
}
static function genContext($dataBuf)
{
return stream_context_create(array(
self::PROTOCOL => array(
'data' => $dataBuf,
),
));
}
static function open($dataBuf)
{
return fopen(self::genURL(),'r',FALSE,self::genContext($dataBuf));
}
}
stream_wrapper_register(
sfStreamStringRead::PROTOCOL,
'sfStreamStringRead'
);
$sp = sfStreamStringRead::open("Some String Data\n");
echo fgets($sp);
fclose($sp);
?>