use*_*530 2 php html5 chatroom
我想做的是一个简单的HTML5聊天室,没有什么花哨的,一旦有人说出一些东西,它将它发送给当前连接到服务器的每个人,就是这样.没有存储,没有任何复杂.它必须是灵活的,但是,我的网站应该能够在需要时自动创建单独的聊天室.我已经看过很多演示和示例,但是所有这些都需要我安装node.js或类似的需要终端访问的东西(我没有).我目前正在运行其中一个免费的网站主机,它给你一个ftp客户端,一个mysql数据库,一些php支持就是这样.有没有办法做到这一点?或许我遗漏了一些东西,有没有办法在这些服务器上安装软件包?也许有人知道获得终端访问的方法?任何形式的帮助将不胜感激,谢谢.
小智 9
去过也做过.做到这一点并非易事.
我认为你必须做出一个重要的决定:你是否希望聊天真的是即时的,或者是否可以在每个人看到新消息之前得到2秒的延迟.
如果延迟没问题,您实际上只需每2秒轮询一次服务器,看看是否有新消息可用.没有人喜欢延迟,但根据你想做什么,它可能不会那么糟糕.然后,服务器将在每个请求上检查数据库/文件并返回更新.这是一个非常简单的解决方案,它的工作原理.(如果你认为每2秒轮询浪费资源并且服务器上有不必要的负载......请继续阅读,替代方案可能会更糟.)
完全即时聊天要求服务器可以立即向客户端发送新数据,而无需等待客户端请求.HTTP本身不支持此功能,如果您不想使用任何Flash/Java,我知道这样做的唯一方法是使用comet请求.这些是在服务器上故意挂起一段时间的请求(通常是AJAX),然后在需要发送到客户端的新数据或发生超时时准确返回.每次彗星请求返回时,客户端处理数据并立即发出另一个彗星请求,该请求将再次挂起,直到有新数据可用.我相信纯HTML/JS中的每个聊天网站都是这样做的(包括Facebook,Facebook等).
现在,这很容易.但是你如何在服务器上实现这一点?让我们来看看这种情况:聊天中有10个用户,这意味着10个客户端将会有一个等待新数据的挂起彗星请求.其中一个用户在聊天中写入内容,这会导致向服务器发送额外请求以发布文本.如何在服务器上执行一个PHP脚本导致其他10个执行停止等待并返回新数据?(您可以使用Perl或其他任何东西替换PHP.)您将需要允许多个脚本执行相互通信的内容.(或者PHP代码本身可以每秒轮询一个数据库,但这又引入了延迟.)在这些脚本语言中,任何形式的进程间通信(IPC)都很难,特别是你不知道什么样的模型Web服务器用于执行它们.例如,Apache可以为每个请求创建一个进程,或为每个请求创建一个线程,或者两者兼而有之.但也许你的主机使用IIS或其他东西,所以在这种情况下很难做IPC.我最终做的是在PHP中创建一个自己的服务器组件,它一直在运行,它的任务是在不同的PHP脚本执行之间传递消息.是的,这需要shell访问.所有PHP执行都将通过套接字连接到该服务器组件,并且可以传递消息.这是很棘手的,但最后它运作得很好.
不幸的是,彗星请求对内存和CPU周期非常浪费.我的Apache服务器有一个每PHP进程的执行模型.因此,当聊天中有100个人时,这意味着任何时候都有100个待处理的彗星请求,这意味着有100个Apache进程正在运行.即使一个新的Apache进程只使用10MB,这总共需要1GB!这是一个很大的记忆,这些过程只不过是等待发生的事情.聊天是一个令人难以置信的记忆力.此外,这样的聊天会产生很多请求:每当有人在聊天中说出某些内容时,所有100个请求都会返回,之后您将收到100个新请求.聊天中用户数量的两倍通常意味着请求数量的四倍.你真的希望这是活泼的.Apache在处理这个问题时效率并不高.有一些网络服务器软件专门针对彗星请求调整,并且可以很好地扩展,但这又需要更多的服务器访问权限.
所以为了完整性,这是我的故事的结尾:与此同时,我抛弃了所有的PHP并完全改写了聊天.在我看来,Apache和PHP非常不适合这种任务.现在有一个Java服务器组件集成了一个高效的多线程HTTP服务器.我对它进行了压力测试并且表现非常好:连接了500个垃圾邮件客户端,CPU使用率不超过15%,内存使用率保持在150MB.这比我想象的要好得多.与Apache/PHP相比,它的响应能力也有了很大提高.最终结果可以在http://www.dark-chat.info/上查看.虽然由于各种原因聊天目前有些死亡.随着我有更多的时间,这将有希望改变.
好吧,我知道这对你没什么帮助,因为你受到了托管服务提供商的限制.如果没有shell访问权限,那么你真的可以做到这一点.如果你没有2秒的延迟(或者让它1秒钟),并且你不会期望同时超过20个用户,那么你真的可以选择轮询.有一些方法可以优化这一点,例如,活跃用户可以获得1秒的民意调查,而那些很少写东西的人可以获得5秒的民意调查.
也就是说,也许您还可以寻找某种托管解决方案.我确信你可以通过iframe嵌入聊天.
好吧,这比我想要的要长得多.但我希望它可以帮助一些人.:)