Возможно, я спрашиваю о невозможном, но я хотел клонировать поток несколько раз. Этакая эмуляция многоадресной рассылки. Идея состоит в том, чтобы каждые 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');
}
грязный Я не знаю, как синхронизировать процесс чтения кусков, и я подумал, что сокеты могут сделать чудо.
Он работает только в том же сценарии, который создает буферный файл и затем выводит его на экран. Другие скрипты будут неправильно его читать
Использование одного файла без какого-либо контроля потока не должно быть проблемой — хвост -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() но есть немного хорошо доступны скрипты, которые делают большинство сложных вещей для вас.
Других решений пока нет …