需要服务器端计时器(独立于浏览器)

时间:2010-12-10 01:23:43

标签: server-side

我正在组建一个网站,用于跟踪具有时间限制的用户定义事件。每个用户都可以自由创建事件,当时间限制到期时,服务器需要根据事件的结果采取一些行动。我正在努力的具体组件是时间保持:像eBay的拍卖时钟一样 - 它会在某个时间到期,显然在服务器端运行,并在时间用完时采取一些行动。不幸的是,搜索“服务器端计时器”只会返回一个计时器的结果,该计时器从服务器而不是客户端获取时间。 :(

最明显的解决方案是在服务器上运行一个脚本,一些程序可以监视所有时钟并在任何时钟到期时采取措施。可悲的是,我将使用免费的网络托管,并真诚地怀疑我能找到一个让我在他们的服务器上运行任意东西的人。

我研究过的解决方案:

主要概念选项1:说服每个用户的浏览器运行必要的计时器(琐碎的javascript),当计时器到期时,采取必要的行动。这种方法的问题显而易见:可能有数百个(如果不是数千个)同时到期的定时器(它们将倾向于在群集中到期),最坏的情况是每个可能的用户都可能正在查看其定时器到期。这是服务器过载,等待在最糟糕的时刻发生。

主要概念选项2:拥有一个真正值得信赖的浏览器,例如,用户登录网站为“cron”,可以立即运行所有计时器。该操作将全部发生在该浏览器的javascript中,并且只要该浏览器永远不会崩溃,该计算机永远不会失败,并且互联网连接永远不会发生故障,就会很有效。

正如你所看到的,我觉得我正在为这个问题咆哮错误的森林。其他一些想法已经出现:

  • AJAX:我在这里看不到任何可以满足我需要的东西。它是所有浏览器运行的东西,不像服务器端进程,可以独立于用户的浏览器运行。
  • PHP:在服务器上运行整齐,但仅响应客户端请求。我没有看到任何干净的方法让PHP脱离进程并运行独立于用户浏览器的计时器。
  • JS:与PHP相同的问题,但更容易阅读。 ;)
  • Ruby:Ruby可能有一些多线程,但对我来说并不是很明显。是否有可能让每个用户的浏览器检查一下定时器进程是否正在为他们的事件运行,如果不是,则生成一个新的服务器端ruby进程?
  • 我对想法持开放态度 - 我已经开始使用JS和PHP中的概念,但我并没有依赖任何语言,特别是。实际上,唯一的限制是我不会拥有我正在运行该站点的服务器,所以我不能只运行一个简洁的本地进程来完成我需要它做的事情。 :(

    有什么想法吗?提前致谢,

    4 个答案:

    答案 0 :(得分:0)

    ASP.NET具有多线程功能。您可以使用静态变量来收集事件数据,并在时机成熟时使用线程执行所需的操作。您可以清空静态变量,以便将来使用。

    http://leedale.wordpress.com/2007/07/22/multithreading-with-aspnet-20/

    答案 1 :(得分:0)

    您可能需要查看Quartz scheduler for Javaa .NET version也有{{3}}。有了友好的开源许可证(Apache 2.0),这可能是一个非常好的起点。

    答案 2 :(得分:0)

    如果你可以控制cron作业,至少我可以在HostPapa的共享主机上,你可以每秒运行一个php文件来检查定时器并根据它们采取行动。

    答案 3 :(得分:0)

    无论如何,我建议使用AJAX,我们在游戏服务器上做的是通过AJAX请求模拟“服务器连接到客户端”,而没有任何超时(异步连接)。基本上,您为每个挂起在服务器上的客户端创建一个额外的连接,并等待服务器采取自我调用的操作。操作完成后,立即启动一个新的挂起连接,这样您就可以一直挂起(因此服务器可以随时与您的客户端通信)。您可以从服务器发送javascript代码,以决定接下来会发生什么。您可以检查客户端是否在服务器端将这些挂起连接计为有效,当然还要在服务器上运行定时器。