TDC São Paulo 2016 - Become a jedi with php streams

58
Globalcode – Open4education

Transcript of TDC São Paulo 2016 - Become a jedi with php streams

Globalcode – Open4education

WHAT IS A STREAM?

A stream is a body of water[1] with a current,

confined within a bed and stream banks. Depending on its location or certain characteristics, a stream may be referred to as a branch, brook, beck, burn, creek, crick, gill (occasionally ghyll), kill, lick, mill race, rill, river, syke, bayou, rivulet, streamage, wash, run, or runnel.

https://en.wikipedia.org/wiki/Stream

?

DATA FLOW

PHP

F* FILE*

fopen

fpassthru

fputcsv

fputs

fread

fscanf

fseek

fstat

ftell

ftruncate

fwrite

file_ exists

file_ get_ contents

file_ put_ contents

file

fileatime

filectime

filegroup

fileinode

filemtime

fileowner

fileperms

RESOURCEFILE

CONTENTS

fopen( ‘file.txt’, ‘r+’);

file_ get_ contents( ‘file.txt’);

WRAPPERS

file://

http://

ftp://

php://

data://

glob://

ogg://

mandinga://

file://

http://

ftp://

php://

data://

glob://

ogg://

mandinga://

fopen( ‘file.txt’, ‘r+’);

fopen( ‘file://file.txt’, ‘r+’);

!= ?

file://

http://

ftp://

php://

data://

glob://

ogg://

mandinga://

print file_get_contents(

'http://marabesi.

com'

);

$contexto = stream_context_create([

'http' => [

'method' => 'POST'

'header' => 'Content-Type:

application/x-www-form-urlencoded',

'content' => 'livro=php'

]

]);

print file_get_contents(

http://marabesi.com',

false,

$context

);

$fp = fopen(

'http://marabesi.com',

'r',

false,

$context

);

print fgets($fp);

http://php.net/manual/en/context.php

file://

http://

ftp://

php://

data://

glob://

ogg://

mandinga://

$fp = fopen(

'ftp://usuario:senha' .

'@meu_servidor.com' .

'/home/matheusmarabesi/index.php',

'r'

);

file://

http://

ftp://

php://

data://

glob://

ogg://

mandinga://

$put = fopen(

'php://stdin, 'r'

);

print fgets($put);

file://

http://

ftp://

php://

data://

glob://

ogg://

mandinga://

print file_get_contents(

'data://text/plain, Utilizando o

wrapper data://'

);

print file_get_contents(

'data://text/plain, Utilizando o

wrapper data://'

);

<img src="data:

image/jpeg;base64,

YXNodXNhdXNhdWlzYXVzYWl1"

/>

print file_get_contents( 'data:

//text/plain;base64,

VXRpbGl6YW5kbyBzdHJlYW1zIGVtIFBIUCAh');

file://

http://

ftp://

php://

data://

glob://

ogg://

mandinga://

$diretorio = new

\RecursiveDirectoryIterator(

'/var/www'

);

1

$iterator = new

\RecursiveIteratorIterator(

$diretorio

);

2

$arquivos = new \RegexIterator(

$iterator, '/^.+\.php/',

\RecursiveRegexIterator::GET_MATCH

);

3

$diretorio = new \RecursiveDirectoryIterator('/var/www');

$iterator = new \RecursiveIteratorIterator($diretorio);

$arquivos = new \RegexIterator(

$iterator, '/^.+\.php/', \RecursiveRegexIterator::GET_MATCH

);

foreach ($diretorio as $arquivos) {

print $arquivos->getFilename();

}

$diretorio = new

\RecursiveDirectoryIterator(

'glob://var/www/*.php'

);

foreach ($diretorio as $arquivos) {

print $arquivos->getFilename();

}

file://

http://

ftp://

php://

data://

glob://

ogg://

mandinga://

ogg://

file://

http://

ftp://

php://

data://

glob://

ogg://

mandinga://

streamWrapper {

public resource $context ;

__construct ( void )

__destruct ( void )

public bool dir_closedir ( void )

public bool dir_opendir ( string $path , int $options )

public string dir_readdir ( void )

public bool dir_rewinddir ( void )

public bool mkdir ( string $path , int $mode , int $options )

public bool rename ( string $path_from , string $path_to )

public bool rmdir ( string $path , int $options )

public resource stream_cast ( int $cast_as )

public void stream_close ( void )

public bool stream_eof ( void )

public bool stream_flush ( void )

public bool stream_lock ( int $operation )

public bool stream_metadata ( string $path , int $option , mixed $value )

public bool stream_open ( string $path , string $mode , int $options , string &$opened_path

)

public string stream_read ( int $count )

public bool stream_seek ( int $offset , int $whence = SEEK_SET )

public bool stream_set_option ( int $option , int $arg1 , int $arg2 )

public array stream_stat ( void )

THERE IS MORE

class Mandinga {

private $arquivo;

public function stream_open($arquivo, $modo)

{

if (!file_exists($arquivo)) {

throw new \Exception(

'O arquivo informado não existe'

);

$this->arquivo = fopen($arquivo, $modo);

return true;

}

}

public function stream_read($bytes)

{

return fread($this->file,

$bytes);

}

public function stream_eof()

{

return feof($this->file);

}

stream_register_wrapper

stream_wrapper_register

!= ?

stream_register_wrapper(

'mandinga', 'Mandinga'

);

stream_register_wrapper(

'mandinga', 'Mandinga'

);

ALIAS

CLASS NAME

print file_get_contents(

mandinga://pessoas.txt'

);