2009-10-29 12 views
2

브라우저를 통해 웹 서버에서 파일을 다운로드하는 데 걸리는 시간을 기록 (기록) 할 수있는 방법이 있습니까? 파일은 HDD에 기록되며 환경은 램프입니다.파일 다운로드 시간 로그

감사합니다.

답변

1

물론 있습니다. 당신이이 중 아파치가 파일을 알려 mod_rewrite를 사용하는 PHP에 의해 제공 될 것이다 (이 사건의 경우 더 많은 명령을 요청)하거나 같은 파일 가져 오기 위해 PHP 스크립트를 사용

http://youserver.com/download.php?filename=mypicture.jpeg

을 이 같은

그리고 당신이 가질 수 있습니다 download.php :

<?php 
// gets the starting time 
$time_start = microtime(true); 

// WATCHOUT! THIS IS NOT SECURE! EXAMPLE ONLY. 
#$filename = $_GET['filename']; 

// gets the intro.mp3 file and outputs it to the user 
$filename = "intro.mp3"; 
header('Content-type: audio/mpeg'); 
header('Content-Length: '.filesize($filename)); 
header('Content-Disposition: attachment; filename="intro.mp3"'); 
readfile($filename); 

// gets the end time and duration 
$time_end = microtime(true); 

// write time to hdd, database, whatever 
// ... 
error_log("Processing time: ". sprintf("%.4f", ($time_end-$time_start))." seconds"); 
?> 

$filename = $_GET['filename']은 예입니다 사람들이 당신의 서버를 해킹 할 수 없도록 올바르게 이스케이프되어야 함을 기억 마십시오.

편집 :
정말 작동 여부를 확인하기 위해 변경 - 마크 저를 질문했다! ;) 미세 조정이 필요하지만 (특히 미세 시간에) 예, 작동하지 않습니다.!

+1

실제로 작동합니까? 스크립트가 끝나기 전까지는 시간이 걸릴 것이라고 생각했는데 왜 파일 전송이 완료 될 때까지 기다릴까요? – mpen

+0

나는 약간의 조정이 필요했고 위의 코드는 개념 증명 이었지만 예, 사용 된 시간을 기록합니다. PHP는 동기식이므로 readfile()이 그 수명과 함께 갈 때까지 기다려야합니다. – Frankie

+0

PHP는 readfile()이 완료 될 때까지 대기한다는 점에서 동기식 일 수 있지만 나머지 스택에 대해서는 알려주지 않습니다. 아파치는 서버의 RAM 메모리에 전체 파일을 받아 들일 수 있으며, readfile()과 스크립트가 끝날 때까지 천천히 보내야한다. – Wim

0

한 가지 방법은 스크립트를 통해 다운로드를 프록시 처리하는 것입니다 (mod_rewrite로 쉽게 얻을 수 있음). 즉, Content-Type 헤더에 해당하는 MIME 유형에 확장을 매핑하는 것과 같은 모든 작업을 수행해야합니다. 브라우저에서 파일을 다운로드하고 전송 한 헤더를 살펴보십시오. 당신은 그것들을 모방 할 필요가 있습니다. 예를 들어 사용할 수 있습니다. web-sniffer.net에서 헤더를 검사하십시오.

+0

질문의 저자 - 지금은 아마도 AWOL -이 답변은 훌륭한 것입니다. 여러 파일 형식에서이 작업을 수행하려는 경우 MIME 유형을 확인하고 그에 따라 적응해야하기 때문입니다. – Frankie

0

필자는 PHP가 이러한 종류의 정보에 액세스하지 못한다고 생각합니다. 아파치가 알려줄지 모르거나 아래의 방법으로도 파일이 전송 버퍼에 덤프 될 때까지 시간이 걸릴지 모르겠지만 다음을 시도해 보시기 바랍니다.

"% D"지시문을 포함 시키면 "요청을 처리하는 데 걸린 시간 (마이크로 초)"이됩니다.