stream_filter_register

(PHP 5, PHP 7)

stream_filter_registerKullanıcı tanımlı bir akım süzgecini etkin kılar

Açıklama

stream_filter_register ( string $süzgeç , string $sınıf ) : bool

stream_filter_register() işlevi dosya sistemi işlevleriyle (fopen(), fread() gibi) kullanılmak üzere kendi süzgecinizi tanımlamanıza izin verir.

Değiştirgeler

süzgeç

Süzgecin ismi.

sınıf

Bir süzgeci gerçeklemek için, php_user_filter'in bir uzantısı olarak, aşağıda belirtilen üye işlevlerle bir sınıf tanımlamanız gerekir. Süzgecinizin ekli olduğu akım üzerinde okuma ve yazma işlemleri yaparken, PHP tüm veriyi süzgecinizden (ve akıma ekli diğer süzgeçlerden) geçirerek verinin istendiği gibi değiştirilmesini sağlar. Yöntemleri tamamen aşağıda belirtildiği gibi gerçeklemeniz gerekir. Başka türlü yaparsanız süzgecin ne yapacağı belli olmaz.

filter ( resource $in , resource $out , int &$consumed , bool $closing ) : int

Bu yöntem, süzgecin ekli olduğu akım üzerinde yapılan her okuma veya yazma (fread() veya fwrite() gibi) işleminde çağrılır. in değiştirgesi, süzülecek verinin içerdiği bir veya daha fazla sayıda biriktirici nesneden oluşan biriktirici kümesi'ni gösteren bir özkaynaktır. out değiştirgesi, değiştirilen biriktiricilerin konulduğu biriktirici kümesi'ni gösteren bir özkaynaktır. consumed değiştirgesi, süzgecinizce okunan ve değiştirilen veri uzunluğu kadar artmalı ve göreli olarak aktarılmalıdır. Çoğu durumda consumed değeri her $biriktirici için $biriktirici->datalen kadar arttılırılır. Eğer akım kapama sürecindeyse (dolayısıyla bu, süzgeç zincirindeki son geçiştir) closing değiştirgesine TRUE atanmalıdır. filter() yöntemi işini bitirdiğinde şu üç değerden birini döndürmelidir:

Dönüş Değeri Anlamı
PSFS_PASS_ON Süzgeç veriyi başarıyla işleyip biriktirici kümesi'ni out değiştirgesine yerleştirdi.
PSFS_FEED_ME Süzgeç işini tamamladı ancak, döndürülecek bir veri yok. Akımdan veya önceki süzgeçten daha fazla veri gerekiyor.
PSFS_ERR_FATAL (öntanımlı) Süzgeç kurtarılamayacak bir hata tespit etti; devam edilemiyor.

onCreate ( void ) : bool
Bu yöntem süzgeç sınıfının bir nesne olarak örneklenmesi sırasında çağrılır. Süzgeciniz herhangi bir özkaynak ayıracaksa (bir tampon gibi) bunun yapılacağı yer burasıdır. Yöntem başarılı olduğunda TRUE aksi takdirde FALSE döndürmelidir Süzgeciniz ilk örneklendiğinde ve süzgeciniz->onCreate() çağrıldığında, aşağıdaki tabloda gösterilen özellikler kullanılabilir olmalıdır:

Özellik İçeriği
süzgeciniz->filtername Örneklenen süzgecin ismini içeren dizge. Süzgeçler farklı isimlerle veya dosya ismi kalıplarıyla kayıt altına alınabilirler. Bu özellik kullanılacak ismi belirlemek için kullanılır.
süzgeciniz->params params değiştirgesinin içeriği stream_filter_append() veya stream_filter_prepend() işlevine aktarılır.
süzgeciniz->stream Süzülecek akım özkaynağı. Sadece closing değiştirgesine FALSE atanmışken yapılan filter() çağrılarında kullanılabilir.

onClose ( void ) : void

Bu yöntem süzgeç kapanırken çağrılır (genellikle, akım da bu sırada kapanır) ve flush yöntem çağrısından sonra çalıştırılır. onCreate() çağrısı ile oluşturulan veya ayrılan özkaynaklar varsa bunların elden çıkarılacağı veya serbest bırakılacağı yer burasıdır.

Dönen Değerler

Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.

süzgeç zaten tanımlı bir süzgeçse FALSE döner.

Örnekler

Örnek 1 - foo-bar.txt akımında büyük harfe dönüşüm süzgeci

Aşağıdaki örnekte, foo-bar.txt akımında okunup yazılan tüm harfleri büyük harfe çeviren strtoupper isimli bir süzgeç gerçeklenmektedir.

<?php

/* Kendi süzgecimizi tanımlayalım */
class strtoupper_filter extends php_user_filter {
  function 
filter($in$out, &$consumed$closing)
  {
    while (
$bucket stream_bucket_make_writeable($in)) {
      
$bucket->data strtoupper($bucket->data);
      
$consumed += $bucket->datalen;
      
stream_bucket_append($out$bucket);
    }
    return 
PSFS_PASS_ON;
  }
}

/* Süzgecimizi PHP'ye tanıtalım */
stream_filter_register("strtoupper""strtoupper_filter")
    or die(
"Süzgecin tanıtımı başarısız oldu");

$fp fopen("foo-bar.txt""w");

/* Süzgeci açık akıma ekleyelim  */
stream_filter_append($fp"strtoupper");

fwrite($fp"Line1\n");
fwrite($fp"Word - 2\n");
fwrite($fp"Easy As 123\n");

fclose($fp);

/* İçeriği tekrar okuyalım */
readfile("foo-bar.txt");

?>

Yukarıdaki örneğin çıktısı:

LINE1
WORD - 2
EASY AS 123

Örnek 2 - Çok sayıda süzgeç ismiyle eşleşen soysal bir süzgeç sınıfının tanıtımı

<?php

/* Kendi süzgeç sınıfımızı tanımlayalım */
class string_filter extends php_user_filter {
  var 
$mode;

  function 
filter($in$out, &$consumed$closing)
  {
    while (
$bucket stream_bucket_make_writeable($in)) {
      if (
$this->mode == 1) {
        
$bucket->data strtoupper($bucket->data);
      } elseif (
$this->mode == 0) {
        
$bucket->data strtolower($bucket->data);
      }

      
$consumed += $bucket->datalen;
      
stream_bucket_append($out$bucket);
    }
    return 
PSFS_PASS_ON;
  }

  function 
onCreate()
  {
    if (
$this->filtername == 'str.toupper') {
      
$this->mode 1;
    } elseif (
$this->filtername == 'str.tolower') {
      
$this->mode 0;
    } else {
      
/* PHP'nin başka str.* süzgeçlerine bakması için
         başarısızlığı raporluyoruz */
      
return false;
    }

    return 
true;
  }
}

/*Süzgecimizi PHP'ye tanıtalım */
stream_filter_register("str.*""string_filter")
    or die(
"Süzgeç tanıtılamadı");

$fp fopen("foo-bar.txt""w");

/* Süzgeci açık akıma ekleyelim.
   Burada str.tolower süzgecini de ekleyebilirdik. */
stream_filter_append($fp"str.toupper");

fwrite($fp"Line1\n");
fwrite($fp"Word - 2\n");
fwrite($fp"Easy As 123\n");

fclose($fp);

/* İçeriği tekrar okuyalım */
readfile("foo-bar.txt");
?>

Yukarıdaki örneğin çıktısı:

LINE1
WORD - 2
EASY AS 123

Ayrıca Bakınız