php의 stream_bucket_make_writable () 함수를 사용하는 경우 일부 개발자는 False를 반환하는 상황이 발생하여 스트림 필터가 제대로 작동하지 않을 수 있습니다. 이 기사는이 기능이 왜 거짓을 반환하고 문제를 해결하기위한 일반적인 방법을 제공하는지 자세히 분석합니다.
stream_bucket_make_writable () 은 PHP 스트림 필터 시스템의 기본 기능입니다. 스트림 필터를 사용자 정의 할 때 스트림에 데이터를 쓰는 데 종종 사용됩니다. 기본 기능은 다음과 같습니다.
들어오는 버킷 큐에서 쓸 수있는 버킷을 검색하여 수정 한 다음 스트림으로 전달할 수 있도록하십시오.
함수는 다음과 같이 호출됩니다.
$bucket = stream_bucket_make_writeable($in);
여기서 $ in은 현재 전달 된 필터의 데이터 큐를 나타내는 버킷 여단입니다.
성공하면 함수는 버킷 객체를 반환합니다. 실패한 경우, 거짓 .
이 함수는 거짓을 반환한다는 것은 일반적으로 현재 통과 된 버킷 여단 ( $ in )에 사용 가능한 데이터 블록 (버킷)이 없음을 의미합니다. 여기에는 몇 가지 이유가있을 수 있습니다.
데이터 스트림이 전송되면 필터는 여전히 호출되지만 현재 $ in은 읽을 버킷이 없으므로 자연스럽게 stream_bucket_make_writable () 는 false를 반환합니다.
문제 해결 방법 :
if (($bucket = stream_bucket_make_writeable($in)) === false) {
// 스트림의 끝인지 확인하십시오
error_log("쓸 것이 없습니다 bucket,스트림이 끝났을 수도 있습니다");
}
필터가 실제 출력없이 스트림에 적용되는 경우 (예 : 데이터 쓰기가없는 파일) 버킷이 전달되지 않고 함수는 False를 반환합니다.
테스트 가능한 코드 :
stream_filter_register('example.filter', ExampleFilter::class);
$fp = fopen('php://temp', 'w+');
stream_filter_append($fp, 'example.filter', STREAM_FILTER_WRITE);
fclose($fp); // 작성된 데이터가 없습니다
필터가 "쓰기"또는 "읽기"스트림 방향에 올바르게 적용되어 있는지 확인하십시오. 오리엔테이션이 잘못되면 필터가 데이터를 올바르게 수신하지 못하게됩니다.
예:
// 올바른 글쓰기 방향
stream_filter_append($fp, 'example.filter', STREAM_FILTER_WRITE);
방향이 확실하지 않은 경우 $ Filterparams 디버그 스트림의 동작을 인쇄하는 것이 좋습니다.
사용자 정의 필터 클래스에서 처리 로직이 잘못 처리되지 않거나 사전 에 잘못 되돌아 가면 처리 로직이 부적절하게 기록되면 Stream_Bucket_make_writable () 가 비정상적으로 동작하게됩니다.
기본 필터 프레임 워크는 다음과 유사해야합니다.
class ExampleFilter extends php_user_filter {
public function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
// 데이터를 수정하거나 기록합니다
$bucket->data = strtoupper($bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
while 루프에서 $ 버킷을 올바르게 처리하고 의미없는 조기 반환을 피하십시오.
$ in이 비어 있는지 확인하십시오 : var_dump ($ in)를 사용하여 구조를 인쇄하십시오.
스트림이 데이터를 작성하는지 확인하십시오 . 컨텐츠가 실제로 스트림을 통해 전송되었는지 확인하십시오.
필터의 $ 마감 상태를 디버깅 : 종료 단계에서 필터를 호출하는 것이 일반적입니다.
로깅 동작 사용 : Error_Log ()를 사용하여 로그에 버킷 상태를 작성할 수 있습니다.
PHP 버전 및 호환성 확인 : 일부 이전 버전의 PHP에는 Stream_Filter 관련 버그가 있습니다. gitbox.net 에서 더 높은 버전을 사용하여 재생을 테스트하는 것이 좋습니다.
stream_bucket_make_writable ()는 false를 반환합니다. 대부분 스트림에 데이터가 없거나 전송이 종료 되었기 때문입니다. 실제 응용 분야에서는 의미론을 올바르게 이해하고 필터의 수명주기를 명확히하고 스트림의 전송 타이밍을 마스터함으로써보다 효과적으로 문제를 해결하고 해결할 수 있습니다.
이 기사에 나열된 방법을 통해 허위 반환의 원인을보다 편안하게 배치하고 그에 따라 스트림 필터 구현 로직을 수정할 수 있어야합니다.