2010-02-10 66 views
2

我正在开发基于MSN协议的简单聊天Web应用程序。服务器通过从fsockopen()返回的文件资源与MSN服务器进行通信。客户端通过XMLHttpRequest访问服务器。服务器最初登录并打印出客户通过XMLHttpRequest对象的responseText()接收的联系人列表(格式化为HTML表格)。PHP中的文件资源持久性

这是问题所在。负责与MSN服务器通信的文件资源必须保持活动状态,以便所有与聊天相关的功能都能正常工作(创建对话,跟踪离线/在线状态更改等)。但是,为了完成XMLHttpRequest,PHP脚本必须完成执行。这意味着客户在聊天会话进行期间将不会收到XMLHttpRequest的回应。

最坏的情况是文件资源无法序列化,这意味着我不能简单地将聊天会话存储在$_SESSION []占位符中。

所以,我的问题是,是否有任何可能的方式来将文件资源从一个文件转移到另一个文件?

回答

0

一个可能的解决方案是在服务器端有一个PHP脚本,它不会结束;这样,与fsockopen调用对应的资源将永远不会被删除,并且连接不会被关闭。

关于此问题,您可能需要搜索术语“comet”;基本的想法是在服务器端有一个永远运行的脚本,只要有必要就向客户端发送更新。

而不是让浏览器每隔X秒发送一次Ajax请求,你会保持客户端和服务器之间的开放连接 - 不过要注意的是,不幸的是,PHP通常被认为不是最好的工具工作...

在计算器上:[php] comet

0

资源无法生存,除非你创建PHP扩展,做它的请求的结束(如持续的MySQL连接做mysql_pconnect()为例)。但是,您可以使用Comet技术,例如Dojo工具包支持的Bayeux protocol等与服务器通信。这将需要独立的服务器或长时间运行的请求,在后一种情况下,确保PHP和Web服务器的时间限制不会中止运行时间过长的请求。

0

感谢大家的建议。在我开始这个项目之前,我曾考虑过使用彗星技术,但决定不这样做(PHP/Apache似乎并没有很好地实现)。我想出了一个黑客一起解决方案,不是最优雅,但可行。

一个PHP脚本负责MSN服务器通信,只要用户处于活动状态,它就会运行。它将数据写入文件(email_out),并从文件(email_in)中读取数据。每当客户端发送一个AJAX请求时,一个单独的PHP脚本会将任何POST数据写入文件(email_in),并将从(email_out)返回任何数据。两个脚本直到他们最终访问文件时才会读/写数据(因为会争取文件资源)。

我不知道,建议?这确实不是最有效的方法,但它确实是我能想到的唯一的PHP/Apache解决方案。