Блокировка чтения из файла в PHP - PullRequest
2 голосов
/ 30 ноября 2010

Вот что я хочу выразить в bash:

while true; do
  while read $line; do
    echo "Heard: $line"
  done < fifo
done

Здесь fifo - это путь к именованному каналу.Это будет читать из fifo, но если fifo будет пустым, он будет блокироваться, пока в нем что-то не будет.

Попытка аналогичной вещи в PHP приводит к циклу занятости, так как fgets возвращает, когда ничего нет втруба.

Ответы [ 3 ]

1 голос
/ 30 ноября 2010

Я считаю, Фред блокирует.

1 голос
/ 30 ноября 2010

Добавить

sleep(1);

, чтобы избежать интенсивного использования процессора. Это просто самый простой способ избежать циклов занятости. Вы также можете посмотреть на stream_select () , который позволяет указать тайм-аут, как долго скрипт должен ожидать чтения (или записи) потока. Или вы можете попытаться изменить поведение по умолчанию fgets () для определенного потока с помощью stream_set_blocking () . Я точно не знаю (я сам не пробовал), но, похоже, последний - тот, который вы ищете.

stream_set_blocking($stream, 1);
$r = fgets($stream);
0 голосов
/ 05 декабря 2010

fopen () - это место, где вы получаете блокировку ; не на fgets (). Моя проблема заключалась в том, что я fopen () отредактировал файл, затем запустил мой цикл, поэтому, как только канал был записан в один раз, цикл занятого запускается. Вместо этого, поместив fopen () в цикл, он блокируется, пока не будет записывающее устройство.

...