2014-09-01 6 views
3

웹 사이트에서 웹 컨텐츠를 제공하는 것이 목적 인 일부 PHP 스크립트의 실행 시간을 테스트하고 있습니다.웹 컨텐츠를 제공하는 PHP 스크립트의 실행 시간 측정

그러나 일관성없는 결과가 나타납니다.

실행 시간이 측정되고 텍스트 파일에 기록됩니다.

스크립트 중 하나는 기본적으로 디스크에서 jpeg 이미지를 읽고이를 클라이언트에 제공합니다. 여기

는 관련 코드와 스크립트의 단순화 된 버전입니다 : 제공

<?php 

// save initial time 
$t1 = microtime(true); 

// set header for a jpeg image 
header('Content-Type: image/jpeg'); 

// read a file from the hard drive and send content 
// (the real code serves every time a different image based on the request) 
readfile('the_image.jpg'); 

// flush output buffer 
flush(); 
ob_flush(); 

// save final time 
$t2 = microtime(true); 

// elapsed time in milliseconds 
$te = round(($t2 - $t1) * 1000); 

// write a line to the log file 
$handle = fopen('log.txt', 'a'); 
fwrite($handle, $te . "\n"); 
fclose($handle); 

이미지는 다른 때마다 있습니다. 크기는 약 100KB입니다.

원격 위치에서 웹 사이트에 연결하고 일부 이미지를로드합니다.

내가 밀리 초 단위로 로그 파일의 실행 시간을 보는 PHP 스크립트는 데이터를 보낼 때 것을 (넣어 아마 나는이에 틀렸다) 내가 기대했던이

45 
63 
40 
3 
3 
67 
40 
3 
5 

처럼 보인다 클라이언트 실행은 데이터가 전송 될 때까지 대기합니다.

따라서 위의 코드에서 이미지가 클라이언트로 완전히 전송되면 $t2이 검색됩니다.

왜 이미지가 전송되는 데 3ms 밖에 걸리지 않는 이유는 무엇입니까? 서버에 연결할 때 인터넷 연결을 사용할 경우 3ms를 달성 할 수 없습니다.

PHP가 모든 데이터를 즉시 웹 서버로 보냅니다 (내 경우에는 nginx). 그러면 후자가 클라이언트에 데이터를 전송하는 데 시간이 걸립니다.


업데이트

그것은 문제가 버퍼링을 수행 nginx를 관련이 보인다.

이런 일이 발생하면 nginx은 가능한 한 빨리 PHP의 출력 버퍼를 "먹고"다음 클라이언트에 내용을 보냅니다.

이렇게하면 PHP 인스턴스를 더 빨리 닫을 수 있습니다.

PHP 스크립트는 콘텐츠를 클라이언트로 전송하는 데 필요한 시간을 확인하지 않습니다.

비활성화 할 수있는 방법이없는 것 같습니다. nginx 버퍼링. 나는 많은 "조리법"을 주변에서 인터넷 검색하지만 아무도 작동 발견했습니다.

답변

-1

연결 지연이 요인인지 확인하려면 명령 줄에서 스크립트를 실행 해보십시오. 나는 생각하지 않는다 - 아마 서버에 부하와 관련이있다. 요청시 디스크 또는 CPU가 가득 차게되면 스크립트의 실행 시간에 영향을 미칩니다.

-1

간단하고 간단합니다. flush(); 클라이언트를 기다리지 않습니다.

PHP가 필요로하는 시간이며 네트워크가 아닌 시간입니다.

0
  1. 내 다른 대답
  2. 더 캐싱 시스템이 있습니다. 귀하의 HDD, OS 및 PHP는 로딩 파일을 최적화하기 위해 자신의 업무를 수행하는 모든 캐싱 시스템을 갖추고 있습니다. PHP가 파일을 얼마나 오래로드해야하는지 확인할 수 있습니다.

클라이언트가로드해야하는 시간을 확인하려면 JS를 사용해야합니다.

그리고 잊지 말아야 할 점은, 브라우저에도 캐싱 시스템이 있다는 것입니다. 헤더 또는 다른 URL로 비활성화 할 수 있습니다.