我想在我的网站上创建一个页面,其中将为每个访问者显示一个唯一的数字(1、2、3 等等......)。
例如,如果访客 A 首次连接,则将显示数字“1”。那么如果访客B同时连接,就会显示数字“2”。
但这是困难的部分:如果访问者 A 与网站断开连接,下一个访问者 (C) 将在页面上看到数字“1”(如果同时没有其他访问者连接)。
一些“编程之神”可以帮助我这样做吗?
非常感谢 !克里斯。
我想在我的网站上创建一个页面,其中将为每个访问者显示一个唯一的数字(1、2、3 等等......)。
例如,如果访客 A 首次连接,则将显示数字“1”。那么如果访客B同时连接,就会显示数字“2”。
但这是困难的部分:如果访问者 A 与网站断开连接,下一个访问者 (C) 将在页面上看到数字“1”(如果同时没有其他访问者连接)。
一些“编程之神”可以帮助我这样做吗?
非常感谢 !克里斯。
您不会与网站“连接”和“断开”。您进行 HTTP-Call 以获取页面,然后没有进一步的通信。每个 HTTP-Call 都是单独的连接和断开连接。
但是:您可以使用 AJAX 每隔一秒左右检查一次,以告诉服务器您“还在那里”。(就像一个心跳信号)
可以做到,但不优雅。
问题(1):如果:A 得到 1,B 得到 2,A“断开”,C 得到 1 还是 3?,...
尝试:
用户拨打电话,在数据库中保存他的号码和“超时”时间(现在 + 3 秒),打开一个会话,在其中存储属于用户的行的“id”。
编写一个每秒执行 AJAX 调用的 Javascript 脚本,以便为用户更新数据库中的“超时”时间。
如何获得数字:
使用查询来检查数字是否在超时(计算“用户”的数量并检查您保存的“数字”的最大值是否等于那个,或者......)如果是这样,您可以给新用户一个更大的数字,否则您必须找到哪个数字没有被占用或重新从 1 开始(取决于您对问题 1 的回答)
问题2:你为什么要这样编程?
不确定您使用什么来跟踪用户,mysql、redis 或 svr 可以在请求之间保存数据,例如 nodejs。
无论如何,我认为你需要保留两件事,
因此,当有访客来时,请在一个线程中执行以下操作:
当访客离开时,将其号码插入返回列表的右侧,并减少访客数。
因为 HTTP 协议stateless
没有可靠的方法来实现这一点。
就服务器而言,我只是在下载页面及其内容时才真正连接。这可能涉及 10 个,如果不是数百个实际连接。一旦完成,我将断开连接。
我可能会盯着页面看 10 个小时,但我没有连接。
使用 PHP,您可能会考虑使用会话,将其存储在数据库中将允许您计算会话行数以获得下一个“连接数”,但这在这方面也是不可靠的。该会话是在我与创建会话的 php 脚本的第一次对话中创建的。该会话将存在并通过与您的脚本的后续对话进行刷新,但它会一直存在,直到它的超时期限到期。
在超时发生之前,我可能已经去了其他地方。因此,这对于您的要求也是不可靠的。
@SpazzMarticus 提到的 javascript 'heartbeat' 想法是有可能的,但因为我可以禁用 javascript,所以它也是不可靠的。它还会大大增加您的服务器负载,而收益却很小。想象一下,您有 1000 个用户查看您网站上的页面,即每秒 1000 次心跳检查,但收益甚微。由于您的服务器正忙于计算连接数,您会因为页面加载缓慢而失去多少其他用户。
简而言之,除非你准备好进行大量的开发和大量的试验和错误,否则我会忘记这个想法。