안정적인 웹 페이지 카운터를 구현하는 방법은 무엇입니까?

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

  •  05-07-2019
  •  | 
  •  

문제

웹 페이지 카운터를 구현하는 좋은 방법은 무엇입니까?

표면적으로 이는 간단한 문제이지만 검색 엔진 크롤러 및 로봇, 동일한 사용자의 다중 클릭, 새로 고침 클릭을 처리할 때 문제가 됩니다.

구체적으로 사용자가 반복적으로 클릭하여 링크를 '클릭'하지 않도록 하는 좋은 방법은 무엇입니까?IP 주소?쿠키?두 가지 모두 몇 가지 단점이 있습니다(IP 주소가 반드시 고유할 필요는 없으며 쿠키를 끌 수 있음).

또한 데이터를 저장하는 가장 좋은 방법은 무엇입니까?카운터를 개별적으로 증가시키거나 각 클릭을 로그 테이블에 기록으로 저장한 다음 가끔 요약합니다.

어떤 라이브 경험이라도 도움이 될 것입니다.

+++ 릭 ---

도움이 되었습니까?

해결책 2

그래서 나는 여기의 의견을 바탕으로 이것을 조금 가지고 놀았습니다. 내가 생각해 낸 것은 간단한 필드에서 카운터를 세는 것입니다. 내 앱에는 뷰 속성이있는 코드 스 니펫 엔티티가 있습니다.

스 니펫이 볼 때 메소드가 필터링되면 (흰색 목록) 브라우저가 바라는 것만으로도 :

public bool LogSnippetView(string snippetId, string ipAddress, string userAgent)
{
    if (string.IsNullOrEmpty(userAgent))
       return false;

    userAgent = userAgent.ToLower();

    if (!(userAgent.Contains("mozilla") || !userAgent.StartsWith("safari") ||
        !userAgent.StartsWith("blackberry") || !userAgent.StartsWith("t-mobile") ||
        !userAgent.StartsWith("htc") || !userAgent.StartsWith("opera")))
        return false;

    this.Context.LogSnippetClick(snippetId, IpAddress);
}

저장된 절차는 별도의 테이블을 사용하여 스 니펫 ID, 입력 된 날짜 및 IP 주소를 저장하는 최신 뷰를 일시적으로 유지합니다. 각보기가 기록되며 새 뷰가 들어 오면 지난 2 분 안에 동일한 IP 주소 가이 스 니펫에 액세스했는지 확인합니다. 그렇다면 아무것도 기록되지 않습니다.

새로운보기 인 경우보기가 기록되어 (다시 Snippetid, IP, 입력) Snippets 테이블에서 실제보기 필드가 업데이트됩니다.

새로운 모습이 아닌 경우 4 분보다 오래된 뷰로 테이블이 정리됩니다. 이로 인해 언제든지 뷰 로그 테이블에 최소 수의 항목이 발생해야합니다.

저장된 Proc는 다음과 같습니다.

ALTER PROCEDURE [dbo].[LogSnippetClick]
    -- Add the parameters for the stored procedure here 
    @SnippetId AS VARCHAR(MAX),
    @IpAddress AS VARCHAR(MAX)          
   AS
   BEGIN

    SET NOCOUNT ON;

    -- check if don't allow updating if this ip address has already 
    -- clicked on this snippet in the last 2 minutes
    select Id from SnippetClicks 
        WHERE snippetId = @SnippetId AND ipaddress = @IpAddress AND 
              DATEDIFF(minute,  Entered, GETDATE() ) < 2      

     IF @@ROWCOUNT = 0  
     BEGIN              
        INSERT INTO SnippetClicks 
            (SnippetId,IpAddress,Entered) VALUES 
            (@SnippetId,@IpAddress,GETDATE())         
        UPDATE CodeSnippets SET VIEWS = VIEWS + 1 
            WHERE id = @SnippetId
     END
     ELSE
     BEGIN
        -- clean up
        DELETE FROM SnippetClicks WHERE DATEDIFF(minute,Entered,GETDATE()) > 4
     END
END

이것은 상당히 잘 작동하는 것 같습니다. 다른 사람들이 언급했듯이 이것은 완벽하지는 않지만 초기 테스트에서 충분히 좋아 보입니다.

다른 팁

세션과 함께 IP 주소를 사용하십시오. IP 주소의 모든 새 세션을 카운터에 대한 하나의 적중으로 계산하십시오. 이 데이터를 통과해야한다고 생각되면이 데이터를 로그 데이터베이스에 저장할 수 있습니다. 이는 사이트가 가장 많은 트래픽을받을 때 계산하는 데 유용 할 수 있습니다.

PHP를 사용하면 세션을 사용하여 특정 사용자의 활동을 추적 할 수 있습니다. 데이터베이스와 함께 특정 IP 주소에서 활동을 추적 할 수 있으며, 이는 동일한 사용자라고 가정 할 수 있습니다.

타임 스탬프를 사용하여 적중을 제한하고 (예를 들어 5 초당 1 타점을 넘지 않다고 가정하고) 사이트에 대한 새로운 "방문"이 언제 발생하는지 알 수 있습니다 (예를 들어 마지막 히트가 10 분 전인 경우).

봇 또는 방문자 트렌드 (예 : 브라우저 사용)를 감지하는 데 도움이되는 $ _server [] 속성을 찾을 수 있습니다.

편집 : 이전에 히트 및 방문을 추적하여 페이지보기를 히트로 계산하고 새 세션이 만들어 질 때 방문에 +1을 계산했습니다. 쿠키를 지원하지 않는 브라우저 (따라서 세션을 지원하지 않는) 브라우저와 세션을 비활성화하는 사용자는 요즘 상당히 드문 일이므로 걱정하지 않을 것입니다. 지나치게 정확한 이유가 없다면 그것에 대해.

내가 당신이라면 애초에 내 카운터의 정확성을 포기할 것입니다.모든 솔루션(예:쿠키, IP 주소 등)은 말씀하신 것처럼 신뢰할 수 없는 경향이 있습니다.따라서 가장 좋은 방법은 시스템에서 중복성을 사용하는 것입니다.로그인한 사람들을 위해 쿠키, "플래시 쿠키"(공유 개체), IP 주소(아마도 사용자 에이전트와 함께) 및 사용자 ID를 사용합니다.

알 수 없는 클라이언트에 고유 ID가 부여되는 일종의 체계를 구현할 수 있습니다. 이 ID는 (희망적으로) 클라이언트 컴퓨터에 저장되고 모든 요청과 함께 다시 전송됩니다.그런 다음 IP 주소, 사용자 에이전트 및/또는 사용자 ID(그리고 생각할 수 있는 모든 것)를 모든 고유 ID에 연결하거나 그 반대로 연결할 수 있습니다.모든 클릭의 타임스탬프와 고유 ID는 데이터베이스 테이블 어딘가에 기록될 수 있으며, 각 클릭(적어도 웹 사이트에 대한 각 클릭)은 동일한 고유 ID에 대한 마지막 클릭이 얼마나 최근에 있었는지에 따라 허용되거나 거부될 수 있습니다.이것은 아마도 단기적인 클릭 급증에 대해서는 충분히 신뢰할 수 있으며 장기적으로는 어쨌든 별로 중요하지 않을 것입니다(페이지 카운터가 아닌 클릭업 문제의 경우).

친숙한 로봇은 사용자 에이전트를 적절하게 설정해야 하며 알려진 로봇 사용자 에이전트 목록과 비교하여 확인할 수 있습니다. 여기 간단한 구글 검색 후) 실제 사람들과 별도로 적절하게 식별하고 처리하기 위해.

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