我正在考虑使用PHP后端实现实时聊天,但我在讨论彗星的网站上遇到了这个评论:
我的理解是,对于Comet来说,PHP是一种可怕的语言,因为Comet要求你保持对每个浏览器客户端的持久连接.使用mod_php这意味着为每个不完全扩展的客户端占用Apache全职儿童.我认识Comet的人大多使用Twisted Python,它可以处理数百或数千个同时连接.
这是真的?或者是可以配置的东西?
我的问题可能听起来很愚蠢,但我只是想确定一下:
比如说你有一个HTML页面index.html,只显示一个名为的图片img.jpg.现在,如果您的服务器知道访问者每次都会请求HTML文件然后请求jpg图像:
服务器是否可以在HTML文件之后发送图像以节省时间?
我知道HTTP是一种同步协议,所以理论上它不应该工作,但我只是想让某人确认(或不是).
简:有没有办法将数据从服务器推送到登录的用户会话,而用户不需要发出HTTP请求?
Long(呃):我正在Apache/PHP/MySQL服务器上构建一个HTML5应用程序,可以在移动设备上(或者可能通过PhoneGap应用程序)提供给用户.
我希望让用户知道应用程序何时有新信息,而不是通过强制该用户执行对服务器的调用或需要AJAX调用来支付过多的数据费用(是的,我知道它可以检查单个字节cookie,但我宁愿把它变为零).
一个很好的例子就是在两个用户之间发送聊天消息,从一个用户提交给另一个用户.
如果有一个REST资源我想要监视来自其他客户端的更改或修改,那么最好的(也是最RESTful)方式是什么?
我这样做的一个想法是提供特定的资源来保持连接打开,而不是在资源不存在的情况下立即返回.例如,给定资源:
/game/17/playerToMove
Run Code Online (Sandbox Code Playgroud)
这个资源上的"GET"可能会告诉我轮到我的对手了.我可能会注意到移动号码(比如5)并试图检索下一步行动,而不是不断地轮询这个资源以找出轮到我移动的时间:
/game/17/move/5
Run Code Online (Sandbox Code Playgroud)
在"正常"REST模型中,似乎对此URL的GET请求将返回404(未找到)错误.但是,如果相反,服务器保持连接打开,直到我的对手发挥他的移动,即:
PUT /game/17/move/5
Run Code Online (Sandbox Code Playgroud)
然后服务器可以将我的对手PUT的内容返回到该资源.这将为我提供我需要的数据,以及一种通知我的对手何时移动而不需要轮询.
这种方案是RESTful吗?或者它违反了某种REST原则?
我正在寻找一种方法来创建一个简单的HTML表,可以在数据库更改事件时实时更新; 特别添加了一条新记录.
换句话说,将其视为执行仪表板.如果进行了销售并在数据库中添加了新行(在我的情况下是MySQL),那么网页应该用新行"刷新"表格.
我已经看到了一些关于新EVENT GATEWAY用法的信息,但所有的例子都使用Coldfusion作为"推动者",而不是"消费者".我想让Coldfusion将事件更新/推送到网关并消耗响应.
如果可以使用AJAX和CF的组合完成,请告诉我!
我真的只是想了解从何处开始实时更新.
先感谢您!!
编辑/所选答案的说明:
我最终选择@ bpeterson76的答案,因为目前最简单的实施是小规模的.我真的很喜欢他的Datatables建议,这就是我用来近乎实时更新的内容.
随着我的网站越来越大(希望如此),我不确定这是否是一个可扩展的解决方案,因为每个用户都会点击"监听器"页面,然后再查询我的数据库.我的查询相对简单,但我仍然担心将来的性能.
在我看来,随着HTML5开始成为Web标准,@ iKnowKungFoo建议的Web套接字方法很可能是最好的方法.使用长轮询的Comet也是一个好主意,但它实现起来有点麻烦/似乎也有一些扩展问题.
因此,我们希望网络用户开始采用支持HTML5的更现代的浏览器,因为Web套接字是一种相对简单且可扩展的方式来接近实时.
如果您认为我做出了错误的决定,请发表评论.
最后,这里有一些源代码:
使用Javascript:
请注意,这是一个非常简单的实现.它只是想查看当前数据表中的记录数是否已更改,如果是,则更新表并发出警报.生产代码更长,更复杂.这只是展示了一种接近实时更新的简单方法.
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script>
<script type="text/javascript" charset="utf-8">
var originalNumberOfRecsInDatatable = 0;
var oTable;
var setChecker = setInterval(checkIfNewRecordHasBeenAdded,5000); //5 second intervals
function checkIfNewRecordHasBeenAdded() {
//json object to post to CFM page
var postData = {
numberOfRecords: originalNumberOfRecsInDatatable
};
var ajaxResponse = $.ajax({
type: "post",
url: "./tabs/checkIfNewItemIsAvailable.cfm",
contentType: "application/json",
data: JSON.stringify( postData )
})
// When the response comes back, if update is …Run Code Online (Sandbox Code Playgroud) 我正在寻求从我的服务器到我的iPhone应用程序建立某种套接字/ COMET类型功能.基本上,每当用户设法在服务器上设置任意对象'脏'时,例如,更新他们的地址......反馈应该从服务器推送到任何保持对服务器进行实时轮询的客户端.我想这是一个流行词,就是COMET.我知道网页浏览器应用程序有DWR,所以我想,也许最好在我的每个控制器中设置一个隐藏的UIWebView,这样我就可以从他们的javascript框架中开箱即用COMET了?有更优雅的方法吗?
目前我正在开发一个使用Spring 3.1和Hibernate 4的Web应用程序.
根据要求,我想在JSP页面上实现像Facebook这样的推送通知.如果您有任何建议,请同时列出兼容的浏览器及其版本.
在我自己的系统中,我有一个PHP页面显示我通过我的在线网上销售的所有商品,从最新的交易到第一个.
每当人们从我这里买东西时,我希望这个页面自动更新.
我可以AJAX每隔5秒拨打一次电话来检查我的数据库中的订单,但这似乎是1980年?还是人们这样做?
每当调用我的php newOrder()函数(让我们调用它)时,我怎样才能将通知推送到我的php页面?
假设以下场景Web应用程序通过RESTful API提供资源.许多客户端使用此API.目标是使客户端上的数据与Web应用程序保持同步(在两个方向上).
最简单的方法是询问API,自客户端上次与API同步以来,是否有任何资源发生了变化.这意味着客户端需要向API询问是否附带时间戳的相应资源(以查看是否需要更新数据).在我看来,这就像在不必要的带宽消耗方面开销最小的方法一样.
但是,我觉得这种方法在设计和责任方面有一些缺点.例如,API不应该处理检查资源是否过期的问题.似乎API的唯一责任应该是在被要求时提供资源而不必处理更新方面.通过遵循第二种方法,客户端每次想要更新其数据时都会要求大量数据,以使其与Web应用程序保持同步.换句话说,客户端将检查它返回的数据是否比本地存储的数据更新.如果此过程每隔几分钟发生一次,这可能会成为系统的重大负担.
我是否正确地看到了这个或者是否有一条我正在俯瞰的中间道路?
嗨我明白,在长轮询中你保持与服务器的连接打开很长时间,直到你从服务器得到一个响应,然后再次轮询并等待下一个响应.但是,我似乎不明白如何编码它.下面有这个代码使用长轮询,但我似乎没有得到它
(function poll(){
$.ajax({ url: "server", success: function(data){
//update page based on data
}, dataType: "json", complete: poll, timeout: 30000 });
})();
Run Code Online (Sandbox Code Playgroud)
但是这里的连接如何保持开放.我知道一旦获得服务器的响应,就会再次触发"poll"功能.但是如何保持连接打开?
编辑1: - 如果有人也可以解释这里实际超时的情况,那将会很棒
comet ×3
http ×3
php ×3
ajax ×2
jquery ×2
long-polling ×2
rest ×2
cocoa-touch ×1
coldfusion ×1
cordova ×1
iphone ×1
java ×1
javascript ×1
jsp ×1
mysql ×1
networking ×1
objective-c ×1
polling ×1
push ×1
real-time ×1
spring-mvc ×1
tcp ×1