在本地主机内使用PHP广播流

在本地主机内使用PHP广播流,php,broadcast,Php,Broadcast,也许我在问一个不可能的问题,但我想多次克隆一个流。一种多播模拟。其思想是每0.002秒将一个1300字节的大缓冲区写入一个.sock文件(而不是IP:port以避免过热),然后从其他脚本多次读取同一个.sock文件。 通过常规文件执行此操作是不可行的。它只在生成缓冲区文件然后进行回显的同一脚本中工作。其他脚本将严重误读它 这与生成块的脚本完美配合: $handle = @fopen($url, 'rb'); $buffer = 1300; while (1) { $c

也许我在问一个不可能的问题,但我想多次克隆一个流。一种多播模拟。其思想是每0.002秒将一个1300字节的大缓冲区写入一个.sock文件(而不是IP:port以避免过热),然后从其他脚本多次读取同一个.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');
}
但是读取块的另一个脚本的输出:

$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');
}
它很凌乱。我不知道如何同步块的阅读过程,我认为套接字可以创造奇迹

它只在生成缓冲区文件然后进行回显的同一脚本中工作。其他脚本将严重误读它

在没有任何流控制的情况下使用单个文件不应该是一个问题——正是这样做的。缺点是,只要一个客户机有一个打开的文件句柄,数据就会在文件系统上无限累积(即使您截断了文件)

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

do {
   while (!file_exists("$dir/$prefix.$current_chunk")) {
     clearstatcache();
     usleep(1000);
   }
   process(file_get_contents("$dir/$prefix.$current_chunk"));
   $current_chunk++;
} while (!$finished);
同样,您也可以使用数据库来实现这一点,该数据库的轮询开销应该稍微低一些,并简化了旧块的垃圾收集

但这一切都是关于如何使你的解决方案可行的——它并没有真正解决你试图解决的问题。如果我们知道您试图实现的目标,那么我们可能能够就更合适的解决方案提供建议-例如,如果是聊天应用程序、视频广播等

我认为更合适的解决方案应该是使用多线程处理、单内存模型服务器——当我们谈论PHP时(它的线程处理能力不是很好),这意味着一个基于事件/异步的服务器。这比简单地调用()要复杂一些,但是有一些脚本可以为您完成大部分复杂的工作