2011-08-26 8 views
6

मेरे पास वर्तमान में PHP में लिखा गया सर्वर डिमन है जो आने वाले कनेक्शन स्वीकार करता है और stream_socket_* फ़ंक्शन और stream_select() का उपयोग करके सक्रिय स्ट्रीम का उपयोग करके उनके लिए नेटवर्क स्ट्रीम बनाता है। मैं एक zlib फ़िल्टर (string_filter_append() का उपयोग करके) मनमाने ढंग से स्ट्रीम में जोड़ने में सक्षम होना चाहता हूं, लेकिन जब मैं करता हूं, तो मुझे एक त्रुटि मिलती है कि मुझे फ़िल्टर किया गया है कि stream_select() फ़िल्टर किए गए स्ट्रीम को मतदान करने के लिए उपयोग नहीं किया जा सकता है।मैं zlib फ़िल्टर के साथ PHP के stream_select() का उपयोग कैसे करूं?

मैं इस सीमा के आसपास कैसे हो सकता हूं?

उत्तर

3

आप एक पाइप का उपयोग कर सकते हैं, और इसके बजाय फ़िल्टर को पाइप में जोड़ सकते हैं।

यह आपको स्ट्रीम पर stream_select का उपयोग करने की अनुमति देगा, और पाइप zlib के लिए बफर के रूप में कार्य करेगा।

, चुनें() एड धारा से कच्चे डेटा पढ़ें यह पाइप के लिए लिखते हैं, और दूसरी तरफ :) पर डीकोड डेटा को पढ़ने

list($in, $out) = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, 0); 

stream_filter_append($out, 'zlib.inflate', STREAM_FILTER_READ); 
stream_set_blocking($out, 0); 

while (stream_select(...)) { 
    // assuming that $stream is non blocking 
    stream_copy_to_stream($stream, $in); 

    $decoded_data = stream_get_contents($out); 
} 

ही शायद एक php के साथ प्राप्त किया जा सकता है: // मेमोरी स्ट्रीम।

+0

धन्यवाद, यह विधि मुझे सीमा को बाधित करने की अनुमति देती है, हालांकि मैं "zlib.deflate" का उपयोग कर रहा हूं, और मैं स्ट्रीम-टू-स्ट्रीम की प्रतिलिपि नहीं बना रहा हूं, बल्कि सर्वर भेजने के लिए केवल fwrite() का उपयोग कर रहा हूं आउटबाउंड नेटवर्क धाराओं के माध्यम से उत्पन्न डेटा। इस विधि का उपयोग करके, stream_get_contents ($ आउट) 2-बाइट zlib शीर्षलेख देता है और कुछ भी नहीं। अगर मैं फ़ाइल में एक ही डेटा लिखता हूं, $ $ में लिखने और $ पढ़ने के बजाय, संपीड़ित $ डेटा पूरी तरह से लिखा जाता है। क्या इस विधि के बारे में कुछ ऐसा है जो पूर्ण संपीड़ित डेटा को $ आउट से पढ़ने से रोक देगा? – drrcknlsn

+0

कुछ मात्रा में डेटा लिखने के बाद ही फ़िल्टर स्ट्रीम पर लिख सकता है; अधिक डेटा लिखने का प्रयास करें। STREAM_FILTER_READ के साथ पढ़ने वाले पक्ष पर STREAM_FILTER_WRITE VS के साथ लिखने के पक्ष में zlib.deflate फ़िल्टर के साथ भी प्रयास करें। – arnaud576875

संबंधित मुद्दे