z jakiegoś powodu, filtr zlib.deflate
nie wydaje się pracować z parami gniazd generowanych przez stream_socket_pair()
. Wszystko, co można odczytać z drugiego gniazda, to dwubajtowy nagłówek zlib, a wszystko po nim ma wartość NULL.Korzystanie filtr zlib z parą gniazd
Przykład:
<?php
list($in, $out) = stream_socket_pair(STREAM_PF_UNIX,
STREAM_SOCK_STREAM,
STREAM_IPPROTO_IP);
$params = array('level' => 6, 'window' => 15, 'memory' => 9);
stream_filter_append($in, 'zlib.deflate', STREAM_FILTER_WRITE, $params);
stream_set_blocking($in, 0);
stream_set_blocking($out, 0);
fwrite($in, 'Some big long string.');
$compressed = fread($out, 1024);
var_dump($compressed);
fwrite($in, 'Some big long string, take two.');
$compressed = fread($out, 1024);
var_dump($compressed);
fwrite($in, 'Some big long string - third time is the charm?');
$compressed = fread($out, 1024);
var_dump($compressed);
wyjścia:
string(2) "x�"
string(0) ""
string(0) ""
Jeśli komentarz na wezwanie do stream_filter_append()
, pisanie strumień/czytania funkcje prawidłowo, z danymi dumpingu w całości wszystkie trzy razy , a jeśli kieruję strumień filtrowany zlib do pliku zamiast przez parę gniazd, skompresowane dane są zapisywane poprawnie. Więc obie części działają poprawnie osobno, ale nie razem. Czy jest to błąd PHP, który powinienem zgłosić, czy błąd z mojej strony?
to pytanie jest odgałęziony od rozwiązania this related question.
Dziękuję bardzo za wyjaśnienie. Zaimplementowałem ten sam projekt w Ruby i ostatecznie musiałem przekazać 'Zlib :: SYNC_FLUSH' jako drugi argument do' Zlib :: deflate() ', aby działało. Zakładam, że to jest pisanie, a następnie natychmiastowe spłukiwanie po napisaniu. Zauważam, że PHP używa tylko 'Z_SYNC_FLUSH', jeśli ustawiona jest flaga' PSFS_FLAG_FLUSH_INC', ale jak powiedziałeś, bity flag nie wydają się być odsłonięte. – FtDRbwLXw6