Широковещательный поток с PHP внутри localhost

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

грязный Я не знаю, как синхронизировать процесс чтения кусков, и я подумал, что сокеты могут сделать чудо.

2

Решение

Он работает только в том же сценарии, который создает буферный файл и затем выводит его на экран. Другие скрипты будут неправильно его читать

Использование одного файла без какого-либо контроля потока не должно быть проблемой — хвост -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() но есть немного хорошо доступны скрипты, которые делают большинство сложных вещей для вас.

1

Другие решения

Других решений пока нет …