PHP를 사용하여 프로그래밍 방식으로 유효한(죽지 않은) 링크를 확인하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/244506

  •  05-07-2019
  •  | 
  •  

문제

URL 목록이 주어지면 각 URL이 다음과 같은지 확인하고 싶습니다.

  • 200 OK 상태 코드를 반환합니다.
  • X 시간 내에 응답을 반환합니다.

최종 목표는 관리자가 URL을 검토할 수 있도록 잠재적으로 손상된 URL에 플래그를 지정할 수 있는 시스템입니다.

스크립트는 PHP로 작성되며 cron을 통해 매일 실행될 가능성이 높습니다.

스크립트는 한 번에 약 1000개의 URL을 처리합니다.

질문은 두 부분으로 구성됩니다.

  • 이와 같은 작업에 큰 문제가 있습니까? 어떤 문제에 직면했습니까?
  • 정확성과 성능을 모두 고려하여 PHP에서 URL 상태를 확인하는 가장 좋은 방법은 무엇입니까?
도움이 되었습니까?

해결책

PHP 컬 확장을 사용하십시오. Fopen ()과 달리 URL의 가용성을 확인하기에 충분한 HTTP 헤드 요청을 만들고 페이지 전체를 다운로드 할 필요가 없으므로 많은 대역을 절약 할 수 있습니다.

시작점으로 다음과 같은 기능을 사용할 수 있습니다.

function is_available($url, $timeout = 30) {
    $ch = curl_init(); // get cURL handle

    // set cURL options
    $opts = array(CURLOPT_RETURNTRANSFER => true, // do not output to browser
                  CURLOPT_URL => $url,            // set URL
                  CURLOPT_NOBODY => true,         // do a HEAD request only
                  CURLOPT_TIMEOUT => $timeout);   // set timeout
    curl_setopt_array($ch, $opts); 

    curl_exec($ch); // do it!

    $retval = curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200; // check if HTTP OK

    curl_close($ch); // close handle

    return $retval;
}

그러나 가능한 많은 최적화가 있습니다. 컬 인스턴스를 재사용하고 호스트 당 하나 이상의 URL을 확인하면 연결을 재사용 할 수도 있습니다.

아, 그리고이 코드는 HTTP 응답 코드 200을 엄격하게 확인합니다. 리디렉션 (302)을 따르지 않지만 컬 옵션도 있습니다.

다른 팁

컬을 쳐다보세요. PHP를위한 라이브러리가 있습니다.

CURL의 실행 파일 버전도 있으므로 스크립트를 Bash에 쓸 수도 있습니다.

저는 실제로 5,000개 이상의 URL 데이터베이스를 통해 이 작업을 수행하는 내용을 PHP로 작성했습니다.나는 PEAR 클래스를 사용했습니다. HTTP_요청, 이라는 메서드가 있습니다. getResponseCode().URL을 반복하여 getResponseCode에 전달하고 응답을 평가합니다.

그러나 FTP 주소, http 또는 https로 시작하지 않는 URL(확인되지는 않았지만 사실이라고 생각함), 보안 인증서가 유효하지 않은 사이트(0은 찾을 수 없음)에서는 작동하지 않습니다.또한 서버를 찾을 수 없으면 0이 반환됩니다(해당 상태 코드가 없음).

그리고 몇 개의 파일을 포함하고 단일 함수를 사용하여 정수 코드를 다시 가져오므로 cURL보다 더 쉬울 것입니다.

  1. fopen ()은 HTTP URI를 지원합니다.
  2. 더 많은 유연성 (예 : 타임 아웃)이 필요한 경우 컬 확장을 살펴보십시오.

직업이 될 것 같습니다 곱슬 곱슬하다.

PHP Perl의 LWP에 붙어 있지 않으면 답이 될 수 있습니다.

또한 다른 페이지로 리디렉션되는 301 또는 302 HTTP 응답을 반환하는 URL을 알고 있어야합니다. 일반적으로 링크가 유효하지 않다는 의미는 아닙니다. 예를 들어, http://amazon.com 301을 반환하고 리디렉션을 리디렉션합니다 http://www.amazon.com/.

200 응답을 반환하는 것만으로는 충분하지 않습니다. 이전 소유자가 갱신하지 못하면 포르노 / 도박 포털로 변경 한 후 많은 유효한 링크가 "200"을 계속 반환합니다.

도메인 스쿼터는 일반적으로 도메인의 모든 URL이 200을 반환하도록합니다.

의심할 여지없이 직면하게 될 잠재적인 문제 중 하나는 이 스크립트가 실행되는 상자가 인터넷에 대한 액세스를 느슨하게 하는 경우입니다.1000개의 오탐지를 받게 됩니다.

스크립트에서 특정 유형의 기록을 유지하고 실패 후 5일 후에만 실패를 보고하는 것이 더 나을 것입니다.

또한 스크립트는 표준 검사를 계속하기 전에 어떤 방식으로든(알려진 좋은 웹사이트[google?] 검사와 같은) 자체 검사를 수행해야 합니다.

이 작업을 수행하려면 Bash 스크립트 만 있으면됩니다. 비슷한 게시물에서 내 답변을 확인하십시오 여기. HTTP 연결을 재사용하여 속도를 극적으로 향상시키고 일시적 오류를 위해 N 회복 및 리디렉션을 따르는 것은 하나의 라이너입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top