在PHP中使用已打开的连接发送数据

时间:2012-12-26 22:15:49

标签: php connection client

我正在尝试使用PHP将数据发送到客户端来解决我的问题。最大的问题是 - 我要做的是继续使用PHP脚本在单个连接中发送数据。我确定还有其他方法,但目前我不知道如何解决这个问题。

我要做的是:客户端连接到Web服务器并保持连接打开,因此TCP连接已“建立”。他将每隔X秒继续进行一次GET请求,以保持此连接的活跃。

在某些事件的此连接内部,我想在没有他发出请求的情况下向客户端发送一些数据!所以这意味着事件是在服务器端触发的,而不是在客户端触发的。

由于我的客户端是Arduino模块,因此不可能使用任何JavaScript或任何客户端技术。我可以保持连接打开,但我需要使用HTTP将数据传递给客户端。

我在服务器上设置了数据库,当数据库内部发生变化时,PHP会将数据发送到客户端。

我试图在PHP脚本中使用循环运行的php flush();但这并不是我想要的方式。

所以任何建议都表示赞赏。 谢谢。

编辑:将是完美的解决方案也适用于Windows机器!

edit2:将有多个客户端,而不仅仅是一个(例如数百个)

4 个答案:

答案 0 :(得分:1)

只要您没有很多客户端,服务器端事件听起来就像它可以为您工作。 http://dsheiko.com/weblog/html5-and-server-sent-events

请注意,您将拥有数百个客户端,在这种情况下,您可能不希望使用PHP,而是使用node.js。

答案 1 :(得分:0)

CRON工作怎么样?

http://en.wikipedia.org/wiki/Cron

http://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/

我认为这可能是您项目的解决方案。如果我不正常并且CRON正确,那么你所做的就是以给定的间隔执行给定的脚本。所以这基本上是你想要的,脚本每X秒执行一次。在你的脚本中,你的功能是使用数据库。

答案 2 :(得分:0)

我认为您正在寻找的是IPC - 进程间通信。在你的情况下,我会建议一个消息队列(或其中的多个)

(在客户端)

  1. 打开与foo.php
  2. 的连接
  3. 收到新行时,请对其进行处理。
  4. 如果连接超时,请重新打开
  5. (在服务器上 - foo.php

    1. 打开Message Queue(您必须为每个用户注册一个消息队列!)
    2. 注册,以便bar.php了解它。
    3. 开始blocking receive
    4. 收到消息后,发送您要发送的内容,FLUSH OUTPUT BUFFERS,返回 2。
    5. 如果有任何超时,请返回 2。
    6. (在服务器上 - bar.php

      1. 数据库更改时,将消息发送到所有活动队列
      2. 这种方法存在一些问题:

        • 服务器端仅适用于Linux / Unix(包括Mac)
        • 消息队列数量有限
        • 您可能需要做一些家务,删除旧队列等。

        好处:

        • 这是独立于应用程序的。消息队列是一个操作系统功能,因此您的bar.php可以说是一个Java应用程序。

答案 3 :(得分:0)

好的,所以我想我找到了我希望它的工作方式。 flush()无法正常工作的问题是我在刷新之前没有达到刷新缓冲区限制。此外,我正在使用Nginx服务器,我禁用了gzip(以防万一)。

我的测试代码绝对有效:

<?
ob_implicit_flush(1);

for($i=0; $i<10; $i++){
  echo $i;

  //this is for the buffer achieve the minimum size in order to flush data
  echo str_repeat(' ',1024*64);

  sleep(1);
}
?>

在这里找到我的答案:PHP Flush that works... even in Nginx

我会用我的Arduinos测试它是否可以接受这样的输出。谢谢大家的帮助。