【问题标题】:Passing data from PHP script to PHP Event Stream将数据从 PHP 脚本传递到 PHP 事件流
【发布时间】:2016-11-20 13:30:35
【问题描述】:

所以我有一个 PHP 文件,它会随机接收来自第三方的新发布数据。为了简单起见,我们称它为get_data.php,并说它看起来像这样:

<?php
$data = $_REQUEST;
// Data processing

然后我有一个单独的脚本 stream.php,它使用 HTML5 Server-Sent Events 将数据流式传输到(JS)客户端:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

while (true) {
    echo 'data: ' . $data . PHP_EOL;
    echo PHP_EOL;
    ob_flush();
    flush();
    sleep(1);
}

每个脚本本身都运行良好。但是,我需要将第一个脚本中的 $data 传递给第二个脚本。

我知道我可以通过将变量存储在 DB 或临时文件中来实现这一点,但理想情况下我可以仅通过 PHP 来做到这一点。

在另一个文件中包含一个文件看起来也不是一个好的选择,因为流标头可能会与第三方发布数据时发生冲突,我希望将数据处理与流以防后者崩溃。

注意 - 这与其他询问如何在网页上的 PHP 脚本之间传递数据的问题不重复,因为我似乎无法使用 $_SESSION 变量,因为数据是由第三方发布的-party 不同于访问事件流的用户。

【问题讨论】:

  • 您必须将其存储在某个地方。对于这样的事情,您需要一个消息传递系统。查看 Redis pubsub、RabbitMQ 或 ZeroMQ 作为起点。

标签: php parameter-passing server-sent-events event-stream


【解决方案1】:

您可以使用共享内存在离散脚本之间传递数据。 http://php.net/manual/en/intro.sem.php

这将要求两个脚本都在同一物理机器/虚拟机上运行,​​并且您需要确定一种方法来识别哪些共享内存块用于哪个会话。

您可以将它与系统消息队列结合起来,以指示新数据何时(以及可能在何处)到达。虽然要小心,因为它们在 Linux/BSD/Unix 系统上的实现有不同的限制(MacOS 有一些 Linux 没有的恼人限制)

HTH

【讨论】:

  • 该死,这是一个聪明的技巧。我可能最终会将数据存储在数据库或其他东西中,因为它看起来是为我们实现 atm 的更好选择。但是,很高兴知道 真的 有一种方法——尽管相当棘手——让它有效地工作,所以我接受你的回答。对于其他感兴趣的人,this 看起来是一个很好的例子。谢谢,
猜你喜欢
  • 1970-01-01
  • 2011-06-26
  • 2017-04-04
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多