2010-06-05 3 views
0

안녕 얘들 아 나는 현재 이미지 처리기 스크립트를 사용하여 이미지를 제공 할 생각입니다. 두 가지 이미지 소스가 있습니다. 하나는 내 웹 이미지 폴더에 있으며 내 사이트 인터페이스를 구성하는 데 사용되는 이미지가 제공됩니다. 다른 하나는 각 사용자 이미지 폴더에 있으며 자신의 이미지를 저장할 수 있습니다. 각 사용자 이미지에 고유 한 ID를 부여한 다음 이미지 핸들러 스크립트로이 ID를 검색하고 이미지를 제공하고 파일 이름을 변경하려고 생각했습니다. 문제는 내 사이트 이미지 폴더에 데이터베이스에 정보가 없으므로 ID가 없기 때문에 직접 검색하면됩니까? 또한 사용자 이미지를 제공하는 방식이 가장 효율적으로 보이지 않습니다. 누구든지 어떤 제안이라도 있으면 정말 고맙겠습니다.이미지를 효과적으로 제공하는 방법 (PHP)은 무엇입니까?

$sql="SELECT username,file_name FROM images WHERE id=?"; 
$stmt=$conn->prepare($sql); 
$result=$stmt->execute(array($ID)); 

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
$image_name = $row['file_name']; 
$username = $row['username']; 
} 

$path="$username/images/$image_name"; 


header("Expires: -1"); 

header("Cache-Control: no-store, no-cache, must-revalidate"); 

header("Cache-Control: post-check=0, pre-check=0", false); 

readfile($path); 
+0

스크립트에 오류 처리를 추가해야합니다. 레코드 또는 해당 파일을 찾을 수 없으면 어떻게됩니까? – Gumbo

답변

2

가장 현명한 효율적인 방법으로 PHP를 버리고 캐싱을 통해 Apache에서 직접 처리 할 수 ​​있습니다. 사실 이후에 access_log를 파싱하는 것만으로는이 방법으로 이미지를 추적해야하는 이유가 있습니까? 그리고 캐싱이없는 이유는, 새로운 이미지가 새로운 고유 ID를 얻는다고 가정합니다.

당신이 데이터베이스 검색을 필요로한다면 &은 PHP로 서비스를 제공하지만, 사용자 이름으로 이름 붙여진 폴더의 전쟁 일지라도 가능한 보안 문제는 있지만 매우 효과적입니다. 어쩌면 memcached 또는 어딘가에 쿼리 결과를 캐시 할 수 있습니다.

+1

추가 : @Matthew Flaschen의 정적 전용 서버에 대한 언급은 리소스가 늘어난 경우 실제로 좋은 것입니다. 동일한 서버에서도 LightHTTPD 또는 Apache 프로세스 (모든 모듈 제거)가 많은 차이를 만들 수 있습니다. – Wrikken

+0

그래서 기본적으로 내가하고있는 일을합니까? 핸들러가없는 폴더에서 직접 제공해야하는 데이터베이스 정보가없는 곳에서 버튼과 같은 웹 사이트 이미지를 위해 무엇을 권하고 싶습니까? – Scarface

+1

@ 스카 페이스, 나는 그것이 nginx 서버를 언급 가치가 있다고 생각합니다. 역방향 프록시로 사용할 수 있으므로 모든 정적 웹 사이트 이미지가 제공되며 Apache 서버는 사용자가 요청한 것을 알지 못합니다. –

3

이미지를 제공하는 가장 효율적인 방법은 별도의 정적 전용 cookie-free domain에 그들 모두를 가지고있다. 이것은 Flickr와 같은 사이트가 작동하는 방식입니다. 데이터베이스에 저장하기 만하면 정적 URL을 구성하기에 충분한 정보입니다.

+0

그게 제가 생각한 것입니다. 그러나이 기능이 아직 없다는 것을 감안할 때, 내가하고있는 방식으로 각 이미지를 제공하고 헤더와 버튼과 같은 웹 사이트 이미지를 어떻게 제공해야합니까? – Scarface

+1

실제로 별도의 물리적 서버 일 필요는 없습니다. 두 번째 가상 호스트가 충분합니다. –

+0

@Scarface, 나는 PHP를 통해 모든 정적 컨텐츠를 실행하지 않을 것입니다. Frank는 물리 서버가 하나만 있더라도 별도의 가상 호스트를 사용할 수 있다고합니다. –

3

이미지를 제공하는 가장 효율적인 방법은 PHP를 전혀 사용하지 않는 것입니다.

웹 서버가 디스크에서 직접 이미지를 제공 할 수있게하십시오. 그들은 어쨌든 리눅스에 의해 메모리에 캐시되기 때문에 정말 빠릅니다. PHP에서 할 수있는 것보다 몇 배 빠릅니다. 불똥 벌레를로드하고 직접 시도하십시오. 아파치가 디스크에서 이미지를 반환하는 데 걸리는 시간과 스크립트 (예 : readfile()을 사용한 비슷한 스크립트로 1 년 전에 했음)를 비교합니다. 그 차이는 중요합니다. ab 또는 httperf와 같은로드 테스터를 실행하면 초당 요청의 차이가 훨씬 커질 수 있습니다.

일부 http 서버가 지원하는 X-Sendfile도 항상 있습니다. 당신이 적어도

+0

원래는 디스크에서 직접하는 것이지만 나는 봇과 악의적 인 사용자가이 내용을 찾아서 내 서버에 부담을 줄 수있는 모든 것을 다운로드하는 것을 더 어렵게 만들고 싶습니다. 그래서 파일 이름을 섞어서 PHP 스크립트에서 제공하므로 디렉토리 표시되지 않습니다. 당신의 방법은 이것으로부터 보호 할 수 있습니까? – Scarface

+0

어쩌면 예제를 넣을 수 있습니까? 정확히 무엇을 의미하는지 확신 할 수 없습니까? – Scarface

+0

nginx, lighttpd 및 varnish는 모두 서버에 부담을주지 않고 초당 이미지 요청 수천 회를 처리 할 수 ​​있습니다. 뭔가가 있다면 대역폭에 대해 더 염려 할 것입니다. 봇이 이미지를 요청하지 못하도록 PHP 스크립트가 정확히 얼마나 기대합니까? image.php? id = 123은 요청하기 쉽습니다. /images/123.jpg –

0

내가 대신, 나는 당신의 문제가 템플릿에 있지만 무엇인지 이해 확실하지 않다이야 있도록

다른 방법으로는, 스크립트의 앞에 니스 같은 캐싱 리버스 프록시를 넣어 고려 :

<?php 
    $file_data = get_file_data(123); 
?> 
<img src="<?php echo $file_data['user_name'], "/images/", $file_data['image_name']; ?>" /> 

을 그리고 데이터를 탈출하는 것을 잊지 마세요 :

<img src="image_handler.php?id=123" /> 

당신은 써야한다.

PHP로 파일을 제공하면 안됩니다. 또한, 당신은 아파치 lighttpd 또는 nginx를 제공하는 웹 호스트를 찾아야합니다. 아파치는 정적 파일을 제공 할 때 매우 빠르지 않다.

관련 문제