2016-11-20 49 views
1

因此,我有一个PHP文件,它将随机接收来自第三方的新发布数据。为了简单起见,我们把它叫做get_data.php说,它看起来是这样的:将数据从PHP脚本传递到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从第一个脚本传递到第二个脚本。

我知道我可以通过将变量存储在数据库或临时文件中来实现此目的,但理想情况下,我只能通过PHP来完成此操作。

将另一个文件包含在另一个文件中看起来不是一个好选择,因为流标题可能会让第三方发布数据而让事情变得糟糕,而且我希望保持数据处理独立于在后者崩溃的情况下流。

注意 - 这不是要求给我貌似不能使用$_SESSION变量的数据是由第三方不是用户的不同发布如何通过网页上的PHP脚本之间的数据,其他问题重复访问事件流。

+1

您必须存储在某个地方。对于这样的事情,你需要一个消息系统。查看Redis pubsub,RabbitMQ或ZeroMQ作为出发点。 – bcmcfc

回答

1

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

这将需要两个脚本在同一台物理机器上运行,您需要确定一种方法来确定哪个共享内存块用于哪个会话。

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

HTH

+0

该死的,这是一个聪明的伎俩..我可能最终将数据存储在数据库中或者其他东西,因为它看起来像是更好的选项来实现atm。然而,很高兴知道_really_是一种方式 - 尽管相当棘手 - 让它有效地工作,所以我接受你的答案。对于任何感兴趣的人来说,[this](https://secure.php.net/manual/en/shmop.examples-basic.php)看起来就是一个很好的例子。谢谢, –