PHP를 사용하여 프로그래밍 방식으로 유효한(죽지 않은) 링크를 확인하려면 어떻게 해야 합니까?
문제
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보다 더 쉬울 것입니다.
- fopen ()은 HTTP URI를 지원합니다.
- 더 많은 유연성 (예 : 타임 아웃)이 필요한 경우 컬 확장을 살펴보십시오.
직업이 될 것 같습니다 곱슬 곱슬하다.
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 회복 및 리디렉션을 따르는 것은 하나의 라이너입니다.