웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
사용자에게 파일 내용을 뿌릴땐 fpassthru를 쓰자
2014.03.23 15:54
fread말고 fpassthru를 써야되는 이유를 두가지 이유만 적겠습니다.
1. 사용자의 응답속도를 줄일 수 있습니다.
fpassthru는 파일을 열은 포인터를 이용하여 컨텐츠를 사용자에게 실시간으로 뿌려줍니다.
그렇기때문에 사용자가 0.1초라도 더 컨텐츠를 빠르게 볼 수 있습니다.
fread를 사용할경우
fopen(파일 포인터 열음) -> fread(파일 컨텐츠를 불러옴) -> fclose(파일 포인터 종료) -> echo(파일 내용을 전송) -> 종료
fpassthru를 사용할경우
fopen(파일 포인터 열음) -> fpassthru(파일 컨텐츠를 불러오면 바로 출력하여 전송) -> fclose(파일 포인터 종료) -> 종료
의 과정을 거칩니다. 과정이 한개 더 줄어들며 PHP에서 불러온만큼 바로바로 한번에 전송해주니 사용자들의 체감속도가 늘어납니다.
2. 코드가 줄어듭니다.
$fp = fopen('./textfile.txt', 'r'); $content = fread($fp, filesize('./textfile.txt')); echo $content; fclose($fp);
참 번거롭죠.
fpassthru를 쓰면 단 3줄이면 끝납니다.
$fp = fopen('./textfile.txt', 'r'); fpassthru($fp); fclose($fp);
이정도만 해도 충분히 써야될 이유를 적었다고 생각합니다.
댓글 2
-
고구마군
2014.04.07 04:35
-
핸들이막뽑혀
2014.04.07 22:30
이 함수를 쓰시면 안됩니다. fpassthru 함수는 메뉴얼에 나온데로 주어진 파일 디스크립터로부터 EOF 까지 파일 내용을 전부 읽습니다. 만일 읽어야할 파일의 용량이 크다면 out of memory 가 나옵니다.
메모리 사용의 주의해서 사용해야하는것이 꽤 있는데, 이건 차라리 첫뻔째 것이 훨씬 안전한 코드입니다.
안녕하세요. PHP / XE를 이제 시작하는 고구마군 이라고 합니다.
출신이 LINUX C언어 개발자 출신이라 PHP라는 언어의 특성을 잘 이해 하지 못해 궁금한 마음에 글을 올립니다.
C언어의 경우는 소스가 간결하다고 해서 속도가 빠르다고 장담하지 못합니다.
위에 언급해 주신 fopen-fread-fclose-echo 로 처리 하는 경우에 비해 fopen-fpassthru 경우가
소스 코드가 줄어드는부분에 대한 장점은 맞다고 생각합니다.
다만 1번의 속도에 대한 부분은 어떤한 근거가 있는지 궁금합니다.
실제 C언어에서 보면
1)
rc = function( param );
if ( 0 > rc ) return -1;
2)
if ( 0 > ( rc = function( param ))
return -1;
제가 PHP라는 언어의 특성을 잘모르기 때문에 C언어를 기준으로 이야기를 드린 것 입니다.
앞으로 PHP를 사용해야 하는 상황이 되어 fopen-fread-fclose-echo 조합과 fopen-fpassthru 조합 중
성능 상의 이득이 있다 하시는 fpassthru 함수 사용에 대해
DynamicLaser님의 글을 보고 궁금한 마음에 글을 올려 보는 것이오니 답변 부탁 드립니다.
PS : PHP 메뉴얼 페이지를 확인해 봤더니
http://www.php.net/manual/en/function.fpassthru.php
Note:
When using fpassthru() on a binary file on Windows systems, you should make sure to open the file in binary mode by appending a b to the mode used in the call to fopen().
You are encouraged to use the b flag when dealing with binary files, even if your system does not require it, so that your scripts will be more portable.
라고 나옵니다. 여기서 portable 이 [ 이동성이 좋은 / 휴대하기 편한 / 손쉽게 실어 나를수 있는 ]등등의
의미로 사용됩니다만... 메뉴얼 페이지 상에서 속도가 빠르다라는 언급은 없는 것 같습니다.
오히려 메뉴얼 페이지 하단의 사용자 노트를 보시면 50MB 이상의 파일등에서 사용시 문제점이 있는 것으로
글을 올려 놨습니다.
아마도 오래전의 글이기 때문에 인터넷 회선 속도가 현재 우리나라 환경과 다르므로
과거 외국에서 발생한 문제 였을 것으로 보여지기는 합니다.