Exemplo de classe regsitradao como empacotador de fluxo

O exemplo abaixo implementa o manipulador de protocolo var:// que permite acesso de leitura/escrita a uma variável global usando funções padrão de fluxo de sistemas de arquivos como fread(). O protocolo var:// implementado abaixo, fornecido pela URL "var://foo" irá ler/escrever dados de/para $GLOBALS["foo"].

Exemplo #1 Um Fluxo para ler/escrever variáveis globais

<?php

class FluxoDeVariavel {
var
$posicao;
var
$nomevar;

function
abre_fluxo($caminho, $modo, $opcoes, &$caminho_aberto)
{
$url = parse_url($caminho);
$this->nomevar = $url["host"];
$this->posicao = 0;

return
true;
}

function
le_fluxo($contagem)
{
$ret = substr($GLOBALS[$this->nomevar], $this->posicao, $contagem);
$this->posicao += strlen($ret);
return
$ret;
}

function
escreve_fluxo($dados)
{
$esquerda = substr($GLOBALS[$this->nomevar], 0, $this->posicao);
$direita = substr($GLOBALS[$this->nomevar], $this->posicao + strlen($dados));
$GLOBALS[$this->nomevar] = $esquerda . $dados . $direita;
$this->posicao += strlen($dados);
return
strlen($dados);
}

function
posicao_fluxo()
{
return
$this->posicao;
}

function
final_fluxo()
{
return
$this->posicao >= strlen($GLOBALS[$this->nomevar]);
}

function
pesquisa_fluxo($deslocamento, $onde)
{
switch (
$onde) {
case
SEEK_SET:
if (
$deslocamento < strlen($GLOBALS[$this->nomevar]) && $deslocamento >= 0) {
$this->posicao = $deslocamento;
return
true;
} else {
return
false;
}
break;

case
SEEK_CUR:
if (
$deslocamento >= 0) {
$this->posicao += $deslocamento;
return
true;
} else {
return
false;
}
break;

case
SEEK_END:
if (
strlen($GLOBALS[$this->nomevar]) + $deslocamento >= 0) {
$this->posicao = strlen($GLOBALS[$this->nomevar]) + $deslocamento;
return
true;
} else {
return
false;
}
break;

default:
return
false;
}
}

function
metadados_fluxo($caminho, $opcao, $var)
{
if(
$opcao == STREAM_META_TOUCH) {
$url = parse_url($caminho);
$nomevar = $url["host"];
if(!isset(
$GLOBALS[$nomevar])) {
$GLOBALS[$nomevar] = '';
}
return
true;
}
return
false;
}
}

stream_wrapper_register("var", "FluxoDeVariavel")
or die(
"Falha ao registrar protocolo");

$minhavar = "";

$fp = fopen("var://minhavar", "r+");

fwrite($fp, "linha1\n");
fwrite($fp, "linha2\n");
fwrite($fp, "linha3\n");

rewind($fp);
while (!
feof($fp)) {
echo
fgets($fp);
}
fclose($fp);
var_dump($minhavar);

?>

O exemplo acima produzirá:

linha1
linha2
linha3
string(18) "linha1
linha2
linha3
"

adicione uma nota

Notas Enviadas por Usuários (em inglês) 1 note

up
17
pfe dot skh at gmail dot com
15 years ago
Example of stream used with databases :Requirement :A MySQL database with a table named data structured as follow :CREATE TABLE IF NOT EXISTS `data` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `data` varchar(255) NOT NULL,  `when_inserted` datetime NOT NULL,  PRIMARY KEY (`id`)) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;Now with the stream implementation :<?phpclass DBStream {    private $_pdo;    private $_ps;    private $_rowId = 0;    function stream_open($path, $mode, $options, &$opath)    {        $url = parse_url($path);        $url['path'] = substr($url['path'], 1);        try{            $this->_pdo = new PDO("mysql:host={$url['host']};dbname={$url['path']}", $url['user'], isset($url['pass'])? $url['pass'] : '', array());        } catch(PDOException $e){ return false; }        switch ($mode){            case 'w' :                 $this->_ps = $this->_pdo->prepare('INSERT INTO data VALUES(null, ?, NOW())');                break;            case 'r' :                 $this->_ps = $this->_pdo->prepare('SELECT id, data FROM data WHERE id > ? LIMIT 1');                break;            default  : return false;        }        return true;    }    function stream_read()    {         $this->_ps->execute(array($this->_rowId));         if($this->_ps->rowCount() == 0) return false;         $this->_ps->bindcolumn(1, $this->_rowId);         $this->_ps->bindcolumn(2, $ret);         $this->_ps->fetch();         return $ret;    }    function stream_write($data)    {        $this->_ps->execute(array($data));        return strlen($data);    }    function stream_tell()    {        return $this->_rowId;    }    function stream_eof()    {        $this->_ps->execute(array($this->_rowId));        return (bool) $this->_ps->rowCount();    }    function stream_seek($offset, $step)    {        //No need to be implemented    }}stream_register_wrapper('db', 'DBStream');$fr = fopen('db://testuser@localhost/testdb', 'r');$fw = fopen('db://testuser:testpassword@localhost/testdb', 'w');//The two forms above are accepted : for the former, the default password "" will be used$alg = hash_algos();$al = $alg[array_rand($alg)];$data = hash($al, rand(rand(0, 9), rand(10, 999))); // Some random data to be writtenfwrite($fw, $data); // Writing the data to the wrapperwhile($a = fread($fr, 256)){ //A loop for reading from the wrapper    echo $a . '<br />';}?>Hope it helps, cheers ;)
To Top