3

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

这就是问题所在。负责与 MSN 服务器通信的文件资源必须保持活动状态,才能使所有与聊天相关的功能正常工作(创建对话、跟踪离线/在线状态更改等)。然而,为了XMLHttpRequest完成,PHP 脚本必须完成执行。XMLHttpRequest这意味着客户端在聊天会话正在进行时不会得到任何响应。

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

所以,我的问题是,我有没有办法将文件资源从一个文件“传输”到另一个文件?

4

4 回答 4

2

在大多数语言中,不可能在应用程序之间传递文件句柄 - AFAIK 大多数操作系统也不允许这样做。

解决方案是让服务器进程作为守护进程运行——这意味着它需要在网络服务器之外运行。

http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

http://www.phpclasses.org/browse/package/5758.html

C。

于 2010-02-10T09:16:41.767 回答
0

The resource can't survive the end of the request unless you create PHP extension that does it (like persistent MySQL connections do with mysql_pconnect() for example). However, you could use Comet technology and for example Bayeux protocol supported by Dojo toolkit among others, to talk to the server. That would require either standalone server or long-running request, in latter case ensure that PHP and webserver time limits would not kill that request for running too long.

于 2010-02-10T08:56:54.363 回答
0

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

关于这一点,您可能需要搜索术语“彗星”;基本思想是有一个在服务器端永久运行的脚本,在必要时向客户端发送更新。

与其让浏览器每隔 X 秒发送一个 Ajax 请求,不如在客户端和服务器之间保持一个开放的连接——请注意,不幸的是,PHP 通常被认为不是完成这项工作的最佳工具......

在 stackoverflow 上:[php] 彗星

于 2010-02-10T05:21:48.083 回答
0

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

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

不知道,有什么建议吗?这肯定不是最有效的做事方式,但它确实是我能想到的唯一 PHP/apache 解决方案。

于 2010-02-10T21:33:20.207 回答