Функции для работы с потоками
PHP Manual

stream_filter_register

(PHP 5, PHP 7)

stream_filter_registerРегистрирует потоковый фильтр, определённый пользователем

Описание

bool stream_filter_register ( string $filtername , string $classname )

stream_filter_register() позволяет вам реализовать ваш собственный фильтр на любом зарегистрированном потоке, используемом со всеми другими функциями файловой системы (такими как fopen(), fread() и т. д.).

Список параметров

filtername

Название регистрируемого фильтра.

classname

Для того, чтобы реализовать фильтр, вам нужно определить класс как расширение php_user_filter c целым рядом функций-членов. При выполнении операций чтения/записи на потоке, к которому прикреплён ваш фильтр, PHP будет передавать данные через ваш фильтр (и через любые другие фильтры, прикреплённые к потоку), так что данные могут быть изменены как требуется. Вам необходимо реализовать методы точно как описано в php_user_filter. Иная реализация приведёт к непредсказуемому поведению.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

stream_filter_register() будет возвращать FALSE если фильтр с именем filtername уже определён.

Примеры

Пример #1 Фильтр для перевода букв в верхний регистр в потоке foo-bar.txt

Пример ниже реализует фильтр с названием strtoupper на файловом потоке foo-bar.txt, который будет переводить в заглавные все буквы, которые пишутся/читаются из этого потока.

<?php

/* Определяем наш класс фильтра */
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;
  }
}

/* Регистрируем наш фильтр в  PHP */
stream_filter_register("strtoupper""strtoupper_filter")
    or die(
"Не удалось зарегистрировать фильтр");

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

/* Присоединяем зарегистрированный фильтр к только что открытому потоку */
stream_filter_append($fp"strtoupper");

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

fclose($fp);

/* Читаем содержимое снова
 */
readfile("foo-bar.txt");

?>

Результат выполнения данного примера:

LINE1
WORD - 2
EASY AS 123

Пример #2 Регистрация стандартного фильтра, соответствующего множественным именам фильтров.

<?php

/* Определяем наш класс фильтра */
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 {
      
/* Был вызван какой-то другой фильтр str.*,
         возвращаем ошибку, чтобы  PHP мог продолжить его поиск */
      
return false;
    }

    return 
true;
  }
}

/* Регистрируем наш фильтр в  PHP */
stream_filter_register("str.*""string_filter")
    or die(
"Не удалось зарегистрировать фильтр");

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

/* Присоединяем зарегистрированный фильтр к только что открытому потоку
   Мы могли бы использовать здесь  str.tolower */
stream_filter_append($fp"str.toupper");

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

fclose($fp);

/* Читаем содержимое снова
 */
readfile("foo-bar.txt");
?>

Результат выполнения данного примера:

LINE1
WORD - 2
EASY AS 123

Смотрите также


Функции для работы с потоками
PHP Manual