4

我正在创建一个命中计数器,用于跟踪有多少人访问了特定页面。保存此信息的表包含 page_id、ip_address 和时间戳(IP 地址访问页面的时间)。

我遇到的“问题”是保存这些信息的最佳方式。如果我每次用户访问页面时都存储它,它会影响网站性能,并且在保存过程中可能会出现问题。我希望可能使用文件Application_EndGlobal.asax的 将记录添加到计数器表中。但是我怎样才能保存这些记录呢?我是否使用Application变量?如果是,如何?

4

2 回答 2

5
which is the best way to save this information

有三种方法可以帮助不影响页面显示的性能,并且只关心您要保存和保留的数据。

第一种方式

您可以使用从页面调用的处理程序作为图像,仅用于编写此统计计数器。在此处理程序中,您不使用会话,因此您甚至不会阻止其他页面。而且大多数蜘蛛都不会调用它,因此您只编写真实用户。

您可以通过以下方式在页面上拨打电话:

<img src="keepstats.ashx?Page=CurrentPage.aspx" height="1" width="1" alt="" >

处理程序是

// 1x1 transparent GIF
private readonly byte[] GifData = {
    0x47, 0x49, 0x46, 0x38, 0x39, 0x61,
    0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
    0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
    0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
    0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
    0x02, 0x44, 0x01, 0x00, 0x3b
};

public void ProcessRequest (HttpContext context) 
{
    // save here your stat counter

    // send the image
    context.Response.ContentType = "image/gif";
    context.Response.Buffer = false;
    context.Response.OutputStream.Write(GifData, 0, GifData.Length);
}

第二种方式

不是从后面的代码而是从页面内部调用这个函数。这种情况的不利之处在于会话正在锁定页面并且页面必须完全加载以允许下一个请求继续进行。但是是最容易制作的。

<body>
... all the page here...


..bottom of the page..
<%
  // you send this part of the page and user all ready see it
  Response.Flush();
  // now you call the function that calculate the statistics
  // the page still show that is loading, but the user all ready see it
  CallTheStatisticSaveFunction();
%>
</body>

第三种方式

我忘记了另一种方法,即创建一个线程以使工作与页面并行且不可靠。

遗言

在我的代码中,我使用了上述所有技巧,一个用于统计,第二个用于必须在页面上完成但可能需要更多时间的操作。我将线程用于在开始渲染页面之前必须完成的操作,并使用一些技巧,如果线程没有结束,我会渲染我所拥有的。

由于这个原因,我将避免使用会话来了解用户是否已经准备好查看该页面:

  1. 如果用户不使用 cookie,则会话不起作用,并且所有蜘蛛都不使用会话
  2. 如果用户开始看到很多页面,会话数据将会增长。

Application_End您关闭 iis 或停止您的应用程序时,它只会被调用。全局和每次调用的点是,Application_BeginRequest但是你会影响性能,因为每个 asp.net 元素都会调用它,你需要检查它是否是一个页面,如果有别的东西,这个在页面的第一点,你会有延迟。在用户看到一些东西后,我们在这里搜索最后如何编写统计信息。

于 2012-04-22T08:30:25.257 回答
0

你有几个选择;您可以使用Session对象来存储点击,这样当同一个用户(IP地址)点击同一个页面时,它就不会被再次保存。

重要的是要记住,如果您在一台服务器上运行此选项是相关的(当然有网络场的解决方案 - 但我不认为这是您的情况,在这里详细说明它们可能是错误的)并且没有唯一访问者太多,因为 Session 会很快填满你的可用内存。

还有其他选项,例如使用 Redis - 但一开始,Session对于负载不是很高的站点,使用过滤重复点击是可以的。

于 2012-04-22T08:06:17.263 回答