在localhost中使用PHP广播流

时间:2016-03-04 10:14:53

标签: php broadcast

也许我问不可能,但我想多次克隆一个流。一种多播仿真。我们的想法是每隔0.002秒将一个1300字节的大缓冲区写入.sock文件(而不是IP:端口以避免过度使用),然后多次从其他脚本读取相同的.sock文件。 通过常规文件执行它是不可行的。它只能在生成缓冲区文件的同一脚本中工作,然后回显它。其他脚本会误读它。

这与生成块的脚本完美配合:

$handle = @fopen($url, 'rb');

$buffer = 1300;

while (1) {
            $chunck = fread($handle, $buffer);

            $handle2 = fopen('/var/tmp/stream_chunck.tmp', 'w');

            fwrite($handle2, $chunck);

            fclose($handle2);

            readfile('/var/tmp/stream_chunck.tmp');
}

但是另一个读取块的脚本的输出:

while (1) {
                readfile('/var/tmp/stream_chunck.tmp');
}

很乱。我不知道如何同步块的阅读过程,我认为套接字可以创造奇迹。

1 个答案:

答案 0 :(得分:1)

  

它只能在生成缓冲区文件的同一脚本中运行,然后回显它。其他脚本会误读它

使用没有任何流量控制的单个文件应该不是问题 - tail -F就是这样。缺点是,只要单个客户端具有打开的文件句柄(即使您截断文件),数据就会无限期地在文件系统上累积。

但是如果您正在编写块,那么将每个块写入不同的文件(使用原子写入机制),然后每个人都可以通过轮询可用文件来读取它....

do {
   while (!file_exists("$dir/$prefix.$current_chunk")) {
     clearstatcache();
     usleep(1000);
   }
   process(file_get_contents("$dir/$prefix.$current_chunk"));
   $current_chunk++;
} while (!$finished);

同样,你可以使用一个数据库 - 它应该略微降低轮询的开销,并简化旧块的垃圾收集。

但这就是如何使您的解决方案可行 - 它并没有真正解决您试图解决的问题。如果我们知道您要实现的目标,那么我们可能会建议更合适的解决方案 - 例如如果它是聊天应用程序,视频广播,还有别的......

我怀疑更合适的解决方案是使用多处理,单内存模型服务器 - 当我们谈论PHP(它没有真正做好线程)时,这意味着基于事件的/异步服务器。除了简单地调用socket_select()之外,还有更多参与,但有some good个脚本可用,它们可以为您完成大部分复杂的操作。