2010-11-29 3 views
2

Вот то, что я хочу экспрессируется в Баш:Блокировка чтения из файла в PHP

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

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

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

ответ

0

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

1

Добавить

sleep(1); 

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

stream_set_blocking($stream, 1); 
$r = fgets($stream); 
+0

Я видел stream_set_blocking, но для создания потока из файла он сначала считывает весь файл, а затем обертывает содержимое в обертку потока. Это не приведет к тому, что мне нужно. – 2010-11-29 23:58:19

Смежные вопросы