romy4
invoke [brain]
не фильтруется поток
Есть задача: создать поток, заменяющий php://stdout (ну или в данном случае создать фильтр потока). Получился вот такой вот код (вроде правильно копировал с мана).
Проблема: отказывается ловить данные потока.
можете скопировать и проверить работает ли у вас фильтр.
Есть задача: создать поток, заменяющий php://stdout (ну или в данном случае создать фильтр потока). Получился вот такой вот код (вроде правильно копировал с мана).
Проблема: отказывается ловить данные потока.
можете скопировать и проверить работает ли у вас фильтр.
PHP:
class BUFFILTER extends php_user_filter
{
const MOD_TRANSPARENT=0;
const MOD_COLLECT=1;
const MOD_COLLECT_EXT=2;
const MOD_BLOCK=10;
static $buffer=array();
static $buckets=array();
protected $cnt_idcode=0;
protected $mode;
function filter($in,$out,&$consumed,$closing)
{
while ($bucket = stream_bucket_make_writeable($in))
{
switch($this->mode)
{
case BUFFILTER::MOD_COLLECT: $this->mod_collect($bucket->data);break;
case BUFFILTER::MOD_COLLECT_EXT: $this->mod_collect_extended($bucket->data);break;
case BUFFILTER::MOD_BLOCK: $this->mod_block($bucket->data);break;
case BUFFILTER::MOD_TRANSPARENT:default:
$this->mod_transparent($bucket->data);break;
}
array_push($this->buckets,$bucket);
// $bucket->data = strtoupper($bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
function mod_collect(&$data)
{
$data=preg_replace("~({\?(.*?)\?})~","<nd-code id=\"".$this->cnt_idcode."\">\$1</nd-code>",$data);
}
function mod_collect_extended(&$data)
{
}
function mod_block(&$data)
{
$data="";
}
function mod_transparent(&$data)
{
}
function onCreate()
{
switch($this->filtername)
{
case "buf.collect": $this->mode=BUFFILTER::MOD_COLLECT;break;
case "buf.collect_extended":$this->mode=BUFFILTER::MOD_COLLECT_EXT;break;
case "buf.block": $this->mode=BUFFILTER::MOD_BLOCK;break;
case "buf.transparent":default:
$this->mode=BUFFILTER::MOD_TRANSPARENT;break;
}
return TRUE;
}
}
class CORE_EXAMPLE
{
protected $garbage="";
protected $buffer_onoff;
function ob_callback($data,$flags)
{
$data=preg_replace("~({\?(.*?)\?})~","<nd-code id=\"".$this->cnt_idcode."\">\$2</nd-code>",$data);
$this->garbage.="core> ".$data;
}
function flush_output()
{
print_r($this->garbage);
}
function buffering($onoff)
{
if((bool)$onoff===TRUE)
{
ob_start(array($this,"ob_callback"));
}
else
{
ob_end_clean();
}
}
$stdout=fopen("php://stdout","rw");
if(stream_filter_register("buf.*","BUFFILTER")===FALSE)
die("Could not append filter");
$buf_collect=stream_filter_prepend($stdout,"buf.collect",STREAM_FILTER_WRITE|STREAM_FILTER_READ);
echo "THIS CODE WILL BE BUFFERED>>>";
echo "<html><head><title>MyTitle</title></head>\n";
echo "<body>{?body code?}</body>\n";
stream_filter_remove($buf_collect);
echo "THIS CODE WONT BE BUFFERED>>>";
echo "{?another code?}</html>\n";