किसी कारण से, zlib.deflate
फ़िल्टर stream_socket_pair()
द्वारा उत्पन्न सॉकेट जोड़े के साथ काम नहीं कर रहा प्रतीत होता है। जो कि दूसरी सॉकेट से पढ़ा जा सकता है वह दो-बाइट ज़्लिब हेडर है, और उसके बाद सबकुछ शून्य है।सॉकेट जोड़ी के साथ 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()
करने के लिए कॉल बाहर टिप्पणी, धारा लेखन/कार्य पढ़ने सही ढंग से, डेटा के साथ अपनी संपूर्णता में फेंक दिया जा रहा है सभी तीन बार , और यदि मैं सॉकेट जोड़ी के बजाय ज़्लिब फ़िल्टर की गई स्ट्रीम को फ़ाइल में निर्देशित करता हूं, तो संकुचित डेटा सही ढंग से लिखा जाता है। तो दोनों भागों सही ढंग से अलग से काम करते हैं, लेकिन एक साथ नहीं। क्या यह एक PHP बग है जिसे मुझे रिपोर्ट करना चाहिए, या मेरे हिस्से में एक त्रुटि है?
यह प्रश्न this related question के समाधान से ब्रांच किया गया है।
स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। मैंने रूबी में एक ही प्रोजेक्ट को कार्यान्वित किया और इसे 'Zlib :: SYNC_FLUSH' को' Zlib :: deflate() 'के दूसरे तर्क के रूप में कार्य करने के लिए पास करने के लिए समाप्त हो गया। मुझे लगता है कि यह लिख रहा है और फिर लिखने के तुरंत बाद flushing। मुझे लगता है कि PHP केवल 'Z_SYNC_FLUSH' का उपयोग कर रहा है यदि 'PSFS_FLAG_FLUSH_INC' ध्वज सेट किया गया है, लेकिन जैसा कि आपने कहा था, ध्वज बिट्स का खुलासा नहीं होता है। – FtDRbwLXw6