PHP의 블랙리스트에 대해 URL을 테스트하는 가장 좋은 방법은 무엇입니까

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

문제

다양한 소스에서 URL을 스크랩하여 목록이 상당히 커지는 스크립트가 있습니다.현재 저는 원하지 않는 사이트를 필터링하는 데 사용하는 if 문 모음을 갖고 있습니다.이는 분명히 유지 관리가 불가능하므로 URL 마스크 블랙리스트를 필터링하기 위한 빠르고 강력한 솔루션을 찾으려고 노력하고 있습니다.

내가 생각해 낼 수 있는 가장 좋은 방법은 일련의 정규식 패턴을 반복하면서 일치하는 항목을 필터링하는 것입니다.이것이 정말로 최선의 방법입니까, 아니면 작업을 더 잘 수행할 수 있는 다른 방법이 있습니까?

도움이 되었습니까?

해결책

도메인 이름이나 "변수 부분"이 없는 일부 URL을 제외하려는 경우 해결책은 URL만 포함된 테이블과 올바른 인덱스가 있는 데이터베이스를 사용하고 빠른 일치를 수행하는 것입니다.

URL을 처리해서는 안 되는지 알아내는 것은 단지 문제이거나 해당 DB에 대한 빠른 쿼리를 수행하는 것뿐입니다. (일반적으로 "URL 같음" 또는 "URL 시작"을 의미함) -- 파일 크기에 맞고 추가 서버가 필요하지 않은 SQLite DB만큼 간단할 수 있습니다.


PHP 배열의 아이디어에는 한 가지 단점이 있습니다.배열이 커지면 메모리에 저장하는 데에도 점점 더 많은 메모리가 필요하게 됩니다. 그리고 어느 날 너무 많은 메모리를 차지하게 되어 충돌이 발생하게 됩니다. memory_limit ;URL이 수천 개 이상인 경우 해당 솔루션이 최선의 솔루션이 아닐 수도 있습니다.

그래도 URL이나 패턴이 몇 개만 있는 경우에는 PHP 배열을 반복하고 각 값을 다음과 비교하는 것이 좋습니다. strpos ("포함" 또는 "다음으로 시작"의 경우) 또는 preg_match (정규식의 경우) 잘 작동하며 구현하기 가장 쉬운 방법입니다.


복잡한 일치 규칙을 사용하려면 일종의 정규 표현식을 사용하는 것이 유일한 실제 방법일 것입니다.PHP 쪽에서는 다음과 같습니다. preg_match, 또는 SQL 서버(예를 들어 내가 아는 한 MySQL은 정규식을 지원합니다. 하지만 성능에 대해서는 전혀 모릅니다.보다 11.4.2.정규 표현식 자세한 내용은)

다른 팁

사이트를 해시로 유지하고 그렇게 검색해야 합니다.그것은 간단하고 우아합니다:

    $excluded['www.google.com'] = true;
    $excluded['www.mapquest.com'] = true;
    $excluded['www.yahoo.com'] = true;

    $url = "http://www.google.com?q=barefoot+winery";

    $urlArray = parse_url($url)

    if (! isset($excluded[$urlArray['host']]))
    {
        scrape($url)
    }

Pascal이 말했듯이 잠시 후에는 메모리 문제에 직면하게 될 것입니다.그러나 그 시점에서는 URL을 유지하는 것이 더 큰 문제가 될 것입니다.그런 일이 발생하면 데이터베이스로 가십시오.

패턴을 지정할 수 있어야 한다면 정규식 배열을 반복하는 것이 좋습니다.

정확한 일치만 확인하고 패턴은 필요하지 않은 경우 strpos 등을 사용하여 직선 문자열 일치를 수행할 수 있으며 이는 다소 더 빠릅니다.

매번 긴 항목 목록을 메모리에 로드하시겠습니까?나는 egrep이나 grep이 가장 좋은 방법이라고 생각합니다.Linux에서는 파일이 파일 캐시에 남아 있고 결과가 매우 빠르며 egrep이 파일을 통해 실행되므로 모든 아파치 스레드가 메모리에 목록 복사본을 갖고 있는 것은 아닙니다.

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