出於某種原因,zlib.deflate
過濾器似乎並不與stream_socket_pair()
產生插座對合作。所有可以從第二個套接字讀取的是兩個字節的zlib頭,之後的所有內容都是NULL。使用zlib的過濾器與插座對
實施例:
<?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);
輸出:
string(2) "x�"
string(0) ""
string(0) ""
如果我註釋掉調用stream_filter_append()
,流寫入/讀取功能正確,與該數據被傾倒其全文所有三次,如果我將zlib過濾的流導入文件而不是通過套接字對,則壓縮數據將被正確寫入。所以這兩個部分分別正確工作,但不能在一起。這是一個我應該報告的PHP錯誤,還是我的錯誤?
這個問題是由溶液到this related question支鏈的。
非常感謝您的解釋。我在Ruby中實現了相同的項目,最後不得不將'Zlib :: SYNC_FLUSH'作爲第二個參數傳遞給'Zlib :: deflate()'以使其工作。我認爲這是寫作,然後在寫完後立即刷新。我注意到如果設置了PSFS_FLAG_FLUSH_INC標誌,PHP只使用'Z_SYNC_FLUSH',但正如你所說的那樣,標誌位似乎沒有被暴露。 – FtDRbwLXw6