2012-07-20 4 views
0

나는 HTML 페이지와 이미지를 얻기위한 기본 스크립트를 만들었습니다. 하지만 사진을 검색하는 동안 계속 연결 상태를 유지하고 싶습니다.
- 테스트 스크립트로 수행 한 작업은 웹 서버에서 주소를 묻는 메시지가 계속 표시됩니다. 그러나 그것은 효과가 없었습니다.
그럼 어떻게해야합니까? 아니면 내가 잘못 했나요?fsockopen으로 이미지를 다운로드하도록 연결되어 있습니까?

Basic 스크립트 :

function fetch($server, $url, $port = 80, &$resp_head) 
{ 
    if (!$con = @fsockopen($server, $port, $error_number, $error_string, 30)) return False; 
    stream_set_timeout($con, 8600); 

    // Reguest 
    $qry_header = 'GET '.$url." HTTP/1.1\r\n"; 
    $qry_header .= 'Host: '.$server."\r\n"; 
    $qry_header .= 'User-Agent: Mihtyom; (+http://'.$_SERVER['HTTP_HOST']."/)\r\n"; 
    $qry_header .= "Accept: */*\r\n";   //google check the 3 "Accept" 
    $qry_header .= "Accept-Language: *\r\n"; 
    $qry_header .= "Accept-Encoding: *\r\n"; 
    $qry_header .= "Connection: Close\r\n\r\n"; 
    fwrite($con, $qry_header); 

    $inheader = True; 
    $data = ''; 
    while (!feof($con)) 
    { 
     $line = fgets($con); 
     if (!$inheader) 
     { 
      $data .= $line; 
      continue; 
     } 
     if ($line == "\n" || $line == "\r\n") 
     { 
      $inheader = False; 
      continue; 
     } 
     $resp_head[] = trim($line); 
    } 

    fclose($con); 

    return $data; 
} 

테스트 스크립트를

function fetch($server, $urls, $port = 80, &$resp_head) 
{ 
    if (!$con = @fsockopen($server, $port, $error_number, $error_string, 30)) return False; 
    stream_set_timeout($con, 8600); 

    $resp_head = array(); 
    $data = array(); 
    foreach ($urls as $key => $url) 
    { 
     $inheader = True; 
     $data[$key] = ''; 

     // Reguest 
     $qry_header = 'GET '.$url." HTTP/1.1\r\n"; 
     $qry_header .= 'Host: '.$server."\r\n"; 
     $qry_header .= 'User-Agent: Mihtyom; (+http://'.$_SERVER['HTTP_HOST']."/)\r\n"; 
     $qry_header .= "Accept: */*\r\n";   //google check the 3 "Accept" 
     $qry_header .= "Accept-Language: *\r\n"; 
     $qry_header .= "Accept-Encoding: *\r\n"; 
     $qry_header .= "Connection: Close\r\n\r\n"; 
     fwrite($con, $qry_header); 

     while (!feof($con)) 
     { 
      $line = fgets($con); 
      if (!$inheader) 
      { 
       $data[$key] .= $line; 
       continue; 
      } 
      if ($line == "\n" || $line == "\r\n") 
      { 
       $inheader = False; 
       continue; 
      } 
      $resp_head[$key][] = trim($line); 
     } 
    } 
    fclose($con); 
    return $data; 
} 

새로운 스크립트 (21-07-12 12시 34분) :

function fetch($server, $urls, $port = 80, &$resp_head) 
{ 
    if (!$con = @pfsockopen($server, $port, $error_number, $error_string, 30)) return False; 
    stream_set_timeout($con, 8600); 

    $resp_head = array(); 
    $data = ''; 
    $i = count($urls); 
    foreach ($urls as $key => $url) 
    { 
     $i--; 

     // Reguest 
     $qry_header = 'GET '.$url." HTTP/1.1\r\n"; 
     $qry_header .= 'Host: '.$server."\r\n"; 
     $qry_header .= 'User-Agent: Mihtyom; (+http://'.$_SERVER['HTTP_HOST']."/)\r\n"; 
     $qry_header .= "Accept: */*\r\n"; 
     $qry_header .= "Accept-Language: *\r\n"; 
     $qry_header .= "Connection: ".($i == 0 ? 'Close' : 'keep-alive')."\r\n\r\n"; 
     fwrite($con, $qry_header); 
    } 

    while (!feof($con)) 
    { 
     $line = fgets($con); 
     if ($line == "\r\n\r\n" || $line == "\n\n") break; 
     $data .= $line; 
    } 
    fclose($con); 
    return $data; 
} 
+0

별도의 출력물로 읽는 것이 좋습니다. [원시 HTTP 요청을 할 때 HTTP 청크 인코딩 된 문자열을 쉽게 디코딩하는 방법?] (http://stackoverflow.com/questions/10793017/how-to-easily-decode-http-chunked-encoded-string-when-making- 원시 http 요청) –

답변

1

당신은 HTTP에 Connection: Close를 지정 헤더는 기본적으로 서버에 "이 파일 하나만주고 연결을 즉시 닫습니다."라고 알려줍니다. 실제로 연결을 강제로 닫습니다.

대신 서버에 명시 적으로 TCP 세션을 닫지 않도록 알리는 Connection: Keep-Alive을 지정하여 다른 요청에 다시 사용할 수 있습니다.

그러나 서버는 어떤 경우에도이를 허용해서는 안되며 요청 및 응답을 무시할 수도 있습니다 (Connection: Close). 또한 연결의 각 측면은 언제든지 연결을 닫고 다른 쪽이 Connection: Close을 통해 (다음) 헤더에서이를 수행 할 수 있습니다.

올바르게 구현하려면 루프에서 마지막 URL을 처리 할 때 Connection: Close을 지정해야합니다.

영구 연결에 대한 자세한 내용은 HTTP 1.1/RFC 2068 Section 14.10, HTTP 1.1/RFC 2616 Section 19.6.2입니다.

+0

관련 http://stackoverflow.com/questions/7310339/under-what-circumstances-will-my-browser-attempt-to-re-use-a-tcp-connection-for – Kaii

+0

그것을 통해 읽을 수있는 너무 많은, 여기 그리고 지금,하지만 그것을 저장합니다. - 고맙습니다. 하지만 대신, 당신이 제안한 것들을 해냈고 xxx와 xxx라는 응답을 받았지만 여전히 작동하지 않습니다. - 위의 스크립트를 추가했습니다. –

+0

xxx 및 xxx = keep-alive : timeout = 5, max = 1000' 및 'onnection : Keep-Alive' –