Использование памяти фильтра входного потока PHP

Я обрабатываю XML-файлы, считываемые непосредственно из zip-архива, используя поток zip PHP. Иногда эти файлы содержат большие фрагменты CDATA, которые мне не нужны, но делают обработку SimpleXml нехваткой памяти.

Я думал, что реализация потокового фильтра для удаления этих блоков перед передачей данных simple_xml_load_string решит проблему. Но PHP использует точно такой же объем памяти с фильтром и без него.

Мой потоковый фильтр выглядит так:

class JunkContentsNodesStreamFilter extends \php_user_filter
{
const START_MARKER = '<Contents><!\\[CDATA\\[';
const END_MARKER = '\\]\\]></Contents>';

private $skipping = false;

public function filter($in, $out, &$consumed, $closing)
{
while ($bucket = stream_bucket_make_writeable($in)) {
// Always consume all input.
$consumed = $bucket->datalen;

// Entire match in the same bucket. Just remove it.
$bucket->data = preg_replace('^' . self::START_MARKER . '.*?' . self::END_MARKER . '^ms', '', $bucket->data);

if ($this->skipping) {
$pos = strpos($bucket->data, self::END_MARKER);
if ($pos === false) {
// Skip entire block
$bucket->data = '';
} else {
// Found an end marker. Remove and stop skipping
$bucket->data = substr($bucket->data, $pos + strlen(self::END_MARKER));
$this->skipping = false;
}
} else {
$pos = strpos($bucket->data, self::START_MARKER);
if ($pos !== false) {
// Found a start marker. Remove and start skipping
$bucket->data = substr($bucket->data, 0, $pos);
$this->skipping = true;
}
}
$bucket->datalen = strlen($bucket->data);
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}

И я использую это так:

stream_filter_register('junk_contents_nodes', 'JunkContentsNodesStreamFilter');
$data = file_get_contents('php://filter/read=junk_contents_nodes/resource=zip://pathtozip.zip#fileinzip.xml');

Он возвращает удаленное содержимое, но использование памяти совсем не уменьшается. Исходные данные могут составлять около 50 МБ, а извлеченные данные — около 150 КБ, поэтому я ожидал увидеть некоторую разницу.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]