2011-11-30 4 views
0

내 PHP 코드에서 나는 get_meta_tags()을 사용하여 사이트에서 메타 정보를 가져옵니다. 하지만 내 프록시 서버가 연결을 거부하고 다음 오류가 발생합니다 :get_meta_tags() connection refused

경고 : get_meta_tags (http://www.espncricinfo.com/) [function.get-meta-tags] : 스트림을 열지 못했습니다 : 대상 컴퓨터가 적극적으로 거부했기 때문에 연결할 수 없습니다.

아무도 내 PHP 코드에서 프록시를 전달하는 방법을 말해 줄 수 있습니까?

Eclipse XDebug 구성에서 프록시 설정을 시도했지만 올바른 방법이라고 생각하지 않습니다.

curl에서 프록시는 curl_setopt($ch, CURLOPT_PROXY, "host:port");으로 잘 지정되었지만 PHP에서는 제대로 작동하지 않습니다. 도움이 될 것입니다.

-Adithya

답변

2

기본적으로 PHP는 프록시를 사용하지 않습니다. 프록시를 통해 우회하려면 get_meta_tagsDocs 함수 예제와 같이 http stream wrapper Docs (모든 래퍼가 http:// 또는 https://으로 시작하는 "파일 이름"을 처리하고 있음) 함수를 사용하여 모든 함수에 대한 프록시를 추가 할 수 있습니다.

많은 HTTP context options Docs가 있는데, 찾고있는 것은 proxy입니다. 컨텍스트 매개 변수 (파일 이름 만 매개 변수)을 허용하지 않습니다 get_meta_tags으로

, 당신은 (일반적으로) 파일 이름 매개 변수를 받아들이는 PHP 함수를 사용하는 소위 기본 컨텍스트을 변경해야합니다. stream_context_get_defaultDocs으로 설정됩니다.

$opts = array(
    'http' => array(
     'proxy' => 'tcp://127.0.0.1:8000' 
    ) 
); 
stream_context_get_default($opts); 

불행하게도 get_meta_tags는 (적어도 내 PHP 5.3.8 버전) 전혀 스트림 래퍼를 사용하는 일반적인 규칙에 예외처럼 보인다. 그러나 기본 컨텍스트를 사용하여 메타 태그를 얻으려는 데이터를 get_meta_tags으로 옮길 수 있습니다.

data:// stream wrapperDocs으로이 작업을 수행 할 수 있습니다. 약간의 도우미 함수는 변환을 담당 :

/** 
* obtain $filename content as data:// URI 
* 
* @link http://php.net/manual/en/wrappers.data.php 
* 
* @param string $filename 
* @return string data:// URI 
*/ 
function filename_data_uri($filename) 
{ 
    $buffer = file_get_contents($filename); 

    $mime = 'text/plain'; 
    # obtain mime type and charset from http response (if available) 
    if (isset($http_response_header)) 
     foreach($http_response_header as $header) 
      sscanf($header, 'Content-Type: %[^]]', $mime) 
    ; 

    return "data://$mime;base64,".base64_encode($buffer);  
}; 

이 기능은 기본 스트림 컨텍스트를 사용합니다 file_get_contents과 URL에서 내용을 얻을 수 있습니다. 이것이 프록시가 구성된 대상입니다.

그런 다음 get_meta_tags 이것을 결합 할 수 있습니다 :

$url = 'http://www.espncricinfo.com/'; 
$url = filename_data_uri($url); 
$meta_tags = get_meta_tags($url); 

get_meta_tags 이제 프록시를 사용하는 동안 filename_data_uri 기능을 이미 가져온되었습니다 $url의 내용을 운영하고 있습니다. 전체 예제 :

$url = 'http://www.espncricinfo.com/'; 
$proxy = 'tcp://host:port'; 

// configure default context to use proxy 
$opts['http']['proxy'] = $proxy; 
$resource = stream_context_get_default($opts); 

// obtain url contents with default context 
$data = filename_data_uri($url); 
$meta_tags = get_meta_tags($data); 
print_r($meta_tags); 

/** 
* obtain $filename content as data:// URI 
* 
* @link http://php.net/manual/en/wrappers.data.php 
* 
* @param string $filename 
* @return string data:// URI 
*/ 
function filename_data_uri($filename) 
{ 
    $buffer = file_get_contents($filename); 

    $mime = 'text/plain'; 
    # obtain mime type and charset from http response (if available) 
    if (isset($http_response_header)) 
     foreach($http_response_header as $header) 
      sscanf($header, 'Content-Type: %[^]]', $mime) 
    ; 

    return "data://$mime;base64,".base64_encode($buffer);  
}; 
+0

나는 당신의 코드를 시도했지만 그 역시 도움이되지 않습니다! 다음과 같은 오류가 나타납니다 : 경고 : file_get_contents (http://www.espncricinfo.com/) [function.file-get-contents] : 스트림 열기 실패 : HTTP 요청하지 못했습니다! HTTP/1.1 502 프록시 오류 (URL (Uniform Resource Locator)는 인식 된 프로토콜을 사용하지 않습니다. curl (프록시 구성)을 사용하여 웹 사이트 콘텐츠를 가져올 수 있는데 get_meta_tags 함수로 전달했지만 작동하지 않았습니다. 나는 get_meta_tags가 문자열을 취하는 것을 읽었지만 작동하지 않았다. $ buffer는 항상 false입니다. – Adithya

+0

http 헤더에 프로토콜을 지정하는 방법이 있습니까? – Adithya

관련 문제