2009-10-12 3 views
23

PHP 출력 버퍼링에서 전문가의 두뇌를 선택하고 싶습니다. 한 가지 이유 또는 다른 이유로 구현하고자 할 때가 있지만 주위를 둘러보기 위해 항상 코드를 재정렬 할 수 있었던 경우가 있습니다.PHP 출력 버퍼링 - 좋은 생각 같지 않습니까?

자원을 낭비하는 것처럼 들리므로 사용하지 마십시오. 내 말은, 그들이 훌륭한 유연성을 코더에 제공 할 수 있다면 항상 출력을 버퍼링하지 않는 이유는 무엇입니까? 내가 얻을 수있는 유일한 대답은 버퍼링하지 않으면 엄청난 리소스를 절약 할 수 있으므로 좋은 코딩 방법을 사용하면 필요하지 않습니다.

여기 있나요?

답변

19

제 경험으로 볼 때 성능에 큰 영향은 없습니다. 나는 또한 주제에 대해 일관된 답을 찾을 수 없다. 어떤 사람들은 성과에 거의 미치지 못한다고 주장하지만, 일부 사람들은 사소하지만 중요한 효과가 있다고 말한다. php.net에 대해서도 버퍼링이 일 때의 성능이 여러 출력 함수와 비교할 때 성능이 향상된다는 것을 알 수 있습니다.

버퍼링 여부는 응용 프로그램의 의도 된 용도와 더 관련이 있다고 생각합니다. 버퍼링은 출력을 보내기 전에 출력을 압축하려는 경우 또는 출력이 코드에서 언제 그리고 어디에서 발생 하는지를 정확히 제어하려는 경우 많은 의미가 있습니다. 버퍼링을 추가하는 데 많은 노력을 기울이지 않으므로 필요할 때 제거하는 것이 상대적으로 쉽습니다.

+1

와우 그게 내가 처음 들어 본 ... 성능의 잠재적 인 증가. 당신 말이 맞아요. 특히 개발 단계에있는 동안 그걸 가지고 놀아야합니다. – Aaron

+1

성능이 향상되는 논리적 인 이유가 있습니다 - php가 "처리에서 벗어났습니다"가 아니므로 연속적이기 때문에 처리가 훨씬 빠릅니다. 데이터 전송 자체도 마찬가지입니다. 물론 그것은 한 번에 더 많은 메모리를 사용하는 것처럼 보이지만 더 짧은 시간 동안 유지합니다. 아마도 훨씬 많은 작업량을 필요로하는 프레임 워크/라이브러리를로드하고 있기 때문에 "정상적인"소스 코드 양을 출력하는 것을 고려해 볼 때 상당한 차이가 없어야합니다. :-) –

8

나는 그 반대라고 생각합니다. 출력을 버퍼링하지 않으면 실제로 필요한 상황에 처하지 않는 한 나쁜 생각입니다. 예를 들어, 거대한 양의 출력을 생성 할 스크립트.

대부분의 경우 알 수없는 양의 (저렴한) 메모리를 절약하기 위해 많은 시간을 소비하는 프로그래머가 자원 낭비와 같은 소리를냅니다.

+0

생각이 들지만 출력이 큽니다. 사용하지 말고 출력을 끄는 방법이 있습니다. 좋은 지적이야! – Aaron

+1

많은 양의 출력이있는 스크립트의 경우 "꺼두십시오"하는 가장 쉬운 방법은 여러 개의 csv 데이터를 보내는 보고서를 생각하는 것입니다. ob_end_flush(); 스크립트의 맨 위에. flush()로 루프 내에서 출력을 강제 할 수 있습니다. – timdev

4

출력 버퍼링을 사용하여 마지막 PHP 프로젝트의 가정용 양조 MVC 백엔드에 대해 신속하게 경량 템플릿 시스템을 만들 수있었습니다. 나는 그것을 사랑하고 매우 유용하다고 생각합니다.

리소스 관련 : 리소스 집약적 인 것은 아닙니다. 조금이라도 사용하는 것에 대해 걱정이된다면, PHP는 그 일에 적합한 도구가 아닙니다. PHP는 좋아하지만 가장 가벼운 옵션은 아닙니다. 합리적으로 현대적인 서버에서도 문제가되지 않습니다.

+0

@Dinah, 나는 PHP가 매우 가볍다는 인상을 받았다. 그러나 ColdFusion에 익숙해 졌기 때문일 것이다. 무엇이 더 가벼운가요? – Aaron

+1

@Aaron C 또는 ASM PHP는 C, C++, Java, C# 등과 같이 일반적으로 다른 데스크탑 언어보다 속도가 느린 유연성있는 언어입니다. 그러나 다른 스크립팅 언어와 비교해도 꽤 빠를 수 있습니다. – phihag

4

콘텐츠가 헤더보다 먼저 출력되는 상황에 있다면 버퍼에 채워야합니다. 그렇지 않으면 헤더보다 먼저 콘텐츠가 출력된다는 페이지 오류가 발생합니다. 공유 라이브러리로 인해 나에게 이런 일이 일어 났으며 출시를위한 적절한 수정 작업을 수행 할 충분한 시간이 없었습니다. // TODO/FIXME라고 표시 한 다음 나중에 돌아가서 나중에 적절하게 만들 수 있습니다.