也许我问不可能,但我想多次克隆一个流。一种多播仿真。我们的想法是每隔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');
}
很乱。我不知道如何同步块的阅读过程,我认为套接字可以创造奇迹。
答案 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个脚本可用,它们可以为您完成大部分复杂的操作。