Есть значит некая текстовая строка, которая заархивирована zip'ом и после еще закодирована алгоритмом Base64. Мне нужно раскодировать ее обратно, с этим прекрасно справляются функции:
$sourceFile = 'source.txt';
$source = file_get_contents($sourceFile);
var_dump(gzuncompress($base64_decode($source)));
Так же можно сделать это через фильтры стримов:
$fp = fopen($sourceFile, 'rb');
stream_filter_append($fp, 'convert.base64-decode');
stream_filter_append($fp, 'zlib.inflate', STREAM_FILTER_READ, ['level' => 2, 'window' => 15, 'memory' => 6]);
var_dump(stream_get_contents($fp));
fclose($fp);
Это более многословно, но тоже прекрасно работает. Но если можно через стримы, то можно и через врапперы, например так:
var_dump(file_get_contents("php://filter/read=convert.base64-decode|zlib.inflate/resource=$sourceFile"));
И вот тут облом. Нет, base64-decode работает прекрасно, а вот zlib.inflate - не работает. Всмысле возвращает пустую строку.
Еще в интернетах находил вот такой вариант:
var_dump(file_get_contents("compress.zlib://data://text/plain;base64,$source"));
Но это так же не работает, возвращает base64-декодированную строку, а вот распаковка архива не происходит.
Пробовал и на windows, и на linux машинах, а так же на версиях php от 5.6 до 7.4, результат везде одинаков.
Почему zlib не работает именно во врапперах?
При этом не понятно даже как это отлаживать, потому что никаких ошибок не возникает, просто возвращается пустая строка.