2011-08-26 2 views
6

현재 PHP로 작성된 서버 데몬은 들어오는 연결을 허용하고 stream_socket_* 함수를 사용하여 네트워크 스트림을 만들고 stream_select()을 사용하여 활성 스트림을 폴링합니다. 임의의 스트림에 zlib 필터 (string_filter_append() 사용)를 추가 할 수 있기를 원하지만, 할 때 필터링 된 스트림을 폴링하는 데는 stream_select()을 사용할 수 없다는 오류가 발생합니다.PHP의 stream_select()를 zlib 필터와 함께 사용하려면 어떻게해야합니까?

이 제한 사항을 어떻게 해결할 수 있습니까?

답변

3

파이프를 사용할 수 있으며 필터를 파이프에 추가 할 수 있습니다.

이렇게하면 스트림에서 stream_select를 사용할 수 있으며 파이프는 zlib의 버퍼 역할을합니다.

, 선택() 에드 스트림로부터 데이터를 읽어 파이프에 기록하고, 다른 쪽 :)에 디코딩 된 데이터를 판독

같은 아마 PHP 달성 될 수
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); 
} 

: // 메모리 스트림.

+0

감사합니다.이 메서드는 제한을 피할 수 있지만 "zlib.deflate"를 사용하고 stream-to-stream을 복사하지 않고 fwrite()를 사용하여 서버를 보냅니다. 아웃 바운드 네트워크 스트림을 통해 생성 된 데이터 이 메서드를 사용하면 stream_get_contents ($ out)는 2 바이트 zlib 헤더 만 반환하고 그 외에는 아무것도 반환하지 않습니다. $ in에 쓰고 $ out을 읽는 대신 파일에 같은 데이터를 쓰면 압축 된 $ 데이터가 완전히 쓰여집니다. $ out에서 전체 압축 된 데이터를 읽지 못하게하는이 방법에 대한 것이 있습니까? – drrcknlsn

+0

필터는 일정량의 데이터가 기록 된 후에 만 ​​스트림에 기록 할 수 있습니다. 더 많은 데이터를 작성하십시오. 또한 쓰기 측의 zlib.deflate 필터를 STREAM_FILTER_WRITE VS과 함께 읽기 측에서 STREAM_FILTER_READ로 시도해보십시오. – arnaud576875

관련 문제