2009-03-02 40 views
4

我已经使用php,mysql和jquery制作了一个聊天脚本。它使用json从服务器获取数据。它使用最后获取的消息ID向服务器发出固定间隔请求,以从服务器获取新消息。但是,当多个用户聊天时,一小时内就会向服务器发送数千个请求,而托管人员会确定地阻止它。如何使用jQuery,PHP和MySQL实现聊天?

Th gmail聊天使用socket我想。因为它确实不会发送固定的时间间隔请求。请你们中的任何一个给我一些示例代码或一些方向来解决这个问题。

我需要帮助,绝望。

非常感谢提前。我对所有人的尊重和问候。

回答

7

如果您正在使用的主机会“确实阻止它”,如果它提出了很多请求,那么您可能需要考虑在担心代码之前获取不同的主机或升级主机软件包。看看我们选择了从 给另一位用户获取文本的方法如何Facebook implements their chat:

涉及装载 每个Facebook页面的iframe,并 具有iframe的JavaScript通过 在持久 连接HTTP GET请求直到 服务器有客户端的数据才会返回。 如果 中断或超时,请求将重新建立。这不是 通过任何方式一种新技术:它是彗星的 变化,特别是长轮询和/或BOSH的XHR 。

+0

非常感谢您的善意帮助。真的很感激它。 – Kunal 2009-03-02 17:17:31

+0

即使我使用iframe来制作跨域的ajax请求。我的聊天脚本将安装在其他网站上,但消息和用户列表将在我的服务器上。尽管需要了解更多关于持续连接的信息,但是如果你有空闲时间,会很感激一些提示。感谢雅虎! – Kunal 2009-03-03 04:25:25

0

为什么主机会阻止它?如果你的主机不允许那么做一个标准的http请求,那么是时候切换了。

至于使用套接字,没有原生的能力通过JavaScript连接到套接字,但我相信JSocket是一个lib,允许您通过实际连接到您的服务器的嵌入式闪存桥接套接字。还没有找到一个这样做的jquery插件,可能是一个。

您的服务器端代码也会发生巨大变化(持久性vs轮询非常不同),因此您可以为自己的工作做好准备。

我建议你只是在做你正在做的事情,并升级你的主机,如果它无法处理它。除非你一次拥有大量的用户?一个缓存系统可以让你在每一个请求中都不会碰到数据库,如果它忙的话可能会加快速度。

+0

Ho w can we add caching from the page from which I sedning json data to the client?请指教。 – Kunal 2009-03-02 17:19:51

+0

当然。假设您每秒平均有300次更新请求,这通常会转化为每秒300分贝的查询次数。你可以有一个简单的文件,其中包含最新的json数据,在每个请求上检查文件的最后一个mod,如果它老一秒,打你的db和...(限制) – savageguy 2009-03-02 19:22:17

1

您可能会发现使用Prototype的彗星守护程序和jetty webserver看到一个“彗星”技术的例子很有用。码头下载中的示例代码有一个聊天示例应用程序。

我最近安装的码头自己,所以你可能会发现一个日志我安装的命令非常有用:

入门试图从http://maven.apache.org/

运行一个彗星服务

下载Maven Maven的使用http://maven.apache.org/download.html#Installation 安装我做了以下命令: 提取到/home/sdwyer/apache-maven-2.0.9

> [email protected]:~/apache-maven-2.0.9$ export M2_HOME=/home/sdwyer/apache-maven-2.0.9 
> [email protected]:~/apache-maven-2.0.9$ export M2=$M2_HOME/bin 
> [email protected]:~/apache-maven-2.0.9$ export PATH=$M2:$PATH. 
> [email protected]:~/apache-maven-2.0.9$ mvn --version 
-bash: /home/sdwyer/apache-maven-2.0.9/bin/mvn: Permission denied 

> [email protected]:~/apache-maven-2.0.9$ cd bin 
> [email protected]:~/apache-maven-2.0.9/bin$ ls 
m2 m2.bat m2.conf mvn mvn.bat mvnDebug mvnDebug.bat 

> [email protected]:~/apache-maven-2.0.9/bin$ chmod +x mvn 

> [email protected]:~/apache-maven-2.0.9/bin$ mvn –version 

Maven version: 2.0.9 
Java version: 1.5.0_08 
OS name: “linux” version: “2.6.18-4-686″ arch: “i386″ Family: “unix” 
[email protected]:~/apache-maven-2.0.9/bin$ 

http://www.mortbay.org/jetty/ 提取下载码头服务器/home/sdwyer/jetty-6.1.3

> [email protected]:~$ cd jetty-6.1.3//examples/cometd-demo 

> mvn jetty:run 

下载的整个堆栈运行

一旦它完成了,打开浏览器并指向: http://localhost:8080并测试演示。

的例子演示代码可以在目录中找到:

jetty-6.1.3/examples/cometd-demo/src/main/webapp/examples 
1

对还是错,托管公司可能会胡思乱想的一对夫妇的原因:

1)赔率是好的,他们是使用Apache prefork。每个聊天请求可能会成为一个新的连接,从而生成一个单一的Apache进程。每个apache进程都可以从1mb的内存到100mb的内存。 2)如果他们维护数据库服务器,并且你,客户端在数据库编程上吸引人,你可以敲击他们的数据库。 “吸”意味着任何从“没有适当的索引”到“使得一些微小的查询而不是很好的胖子”。

如上所示,确保您的代码使用持久连接。另外:

1)在客户端实现退避算法。在活动期间每秒轮询一次服务器,然后退回到五秒钟,然后是十秒钟,二十秒钟等......这样,当没有任何活动时,您不会敲击服务器。

2)多个标签会杀了你。用户打开10个选项卡,他们都有你的聊天窗口小部件每秒轮询一次服务器?坏消息。即使你的主人不生气,你的表现也会降低。

如果这件事情变得巨大,请设计您的系统,以便您可以独立于Web应用程序的其余部分运行聊天服务器位。换句话说,客户端会向“chat.yourwebapp.com”发出请求,而这个请求又会运行在lighttpd之类的东西上。

0

你想想在页面中嵌入一个小的Flash影片,然后使用套接字来处理与服务器的通信。这将花费很多来自服务器的负载,并且使保持所有内容同步变得更容易。用户界面仍然可以使用JavaScript。
它你会留下你的JavaScript解决方案,然后默默地忽略我的答案:-)