Встроенные фильтры в php

Тема в разделе "PHP", создана пользователем PHPCod3r, 5 фев 2012.

Модераторы: latteo
  1. PHPCod3r

    PHPCod3r

    Регистр.:
    7 июн 2010
    Сообщения:
    261
    Симпатии:
    25
    Преветствую всех, наверно все знают что в пхп есть фильтры, получить полный список, фильтров можно командой
    PHP:
    print_r(stream_get_filters());
    При этом на одном сервере, список фильтров может сильно отличаться от списка на другом
    Далее идем на офф сайт пхп и читаем
    http://ru2.php.net/manual/en/filters.php
    Но я замечал такие фильтры
    consumed
    dechunk
    convert.iconv.*

    В офф документации про них похоже не слова или может я не там искал, помогите разобраться что это за фильтры
    Или хотя бы где в сорцах пхп они определяются, укажите, может там еще что интересное определяется?)
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    561
    хз что это. возможно какой то системный фильтр. Всё что нагуглил- что он добавился в 2006 году.

    http://php.net/manual/ru/migration53.new-stream-filters.php
    Т.е как я понял убирает разбиение от сервера Transfer-Encoding chunked

    http://www.php.net/manual/en/filters.convert.php
    + смотри что делает функция iconv
     
    PHPCod3r нравится это.
  3. playOff

    playOff Писатель

    Регистр.:
    31 янв 2012
    Сообщения:
    2
    Симпатии:
    1
  4. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    561
    PHPCod3r нравится это.
  5. playOff

    playOff Писатель

    Регистр.:
    31 янв 2012
    Сообщения:
    2
    Симпатии:
    1
    convert.iconv.* это зарегистрированный фильтр потока
    вот ссылка с более подробной информацией http://php.com.ua/blog/topic/99/
     
  6. PHPCod3r

    PHPCod3r

    Регистр.:
    7 июн 2010
    Сообщения:
    261
    Симпатии:
    25
    Ок большое спасибо за ответ, мальца сам тоже погуглил и нашел что фильтр consumed
    определеяется в ext\standard\filters.c
    вот так
    Код:
    /* {{{ consumed filter implementation */
    typedef struct _php_consumed_filter_data {
    	int persistent;
    	size_t consumed;
    	off_t offset;
    } php_consumed_filter_data;
    
    static php_stream_filter_status_t consumed_filter_filter(
    	php_stream *stream,
    	php_stream_filter *thisfilter,
    	php_stream_bucket_brigade *buckets_in,
    	php_stream_bucket_brigade *buckets_out,
    	size_t *bytes_consumed,
    	int flags
    	TSRMLS_DC)
    {
    	php_consumed_filter_data *data = (php_consumed_filter_data *)(thisfilter->abstract);
    	php_stream_bucket *bucket;
    	size_t consumed = 0;
    
    	if (data->offset == ~0) {
    		data->offset = php_stream_tell(stream);
    	}
    	while ((bucket = buckets_in->head) != NULL) {
    		php_stream_bucket_unlink(bucket TSRMLS_CC);
    		consumed += bucket->buflen;
    		php_stream_bucket_append(buckets_out, bucket TSRMLS_CC);
    	}
    	if (bytes_consumed) {
    		*bytes_consumed = consumed;
    	}
    	if (flags & PSFS_FLAG_FLUSH_CLOSE) {
    		php_stream_seek(stream, data->offset + data->consumed, SEEK_SET);
    	}
    	data->consumed += consumed;
    	
    	return PSFS_PASS_ON;
    }
    
    static void consumed_filter_dtor(php_stream_filter *thisfilter TSRMLS_DC)
    {
    	if (thisfilter && thisfilter->abstract) {
    		php_consumed_filter_data *data = (php_consumed_filter_data*)thisfilter->abstract;
    		pefree(data, data->persistent);
    	}
    }
    
    static php_stream_filter_ops consumed_filter_ops = {
    	consumed_filter_filter,
    	consumed_filter_dtor,
    	"consumed"
    };
    
    static php_stream_filter *consumed_filter_create(const char *filtername, zval *filterparams, int persistent TSRMLS_DC)
    {
    	php_stream_filter_ops *fops = NULL;
    	php_consumed_filter_data *data;
    
    	if (strcasecmp(filtername, "consumed")) {
    		return NULL;
    	}
    
    	/* Create this filter */
    	data = pecalloc(1, sizeof(php_consumed_filter_data), persistent);
    	if (!data) {
    		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed allocating %zd bytes", sizeof(php_consumed_filter_data));
    		return NULL;
    	}
    	data->persistent = persistent;
    	data->consumed = 0;
    	data->offset = ~0;
    	fops = &consumed_filter_ops;
    
    	return php_stream_filter_alloc(fops, data, persistent);
    }
    
    php_stream_filter_factory consumed_filter_factory = {
    	consumed_filter_create
    };
    
    /* }}} */
    
    Осталось только понять что же он такое страшное делает, и как его применять?
    может у кого есть идеи?

    За сыль спасибо конечно но юзерские фильтры это не много нето. интересуеют имено встроенные фильтры
    Про iconv вот тут расписано
    http://etutorials.org/Server+Admini...s+Wrappers+and+Filters/8.5+Filtering+Streams/
    а на офф сайте не шиша, за исключением кучи баг с этим фильтром ((