Блокировка чтения файлов в php? - PullRequest
1 голос
/ 11 августа 2009

Я хочу прочитать все из текстового файла и повторить его. Но, возможно, во время чтения в текстовый файл записывается больше строк, поэтому я не хочу, чтобы скрипт завершал работу, когда он достиг конца файла, вместо этого я не хочу, чтобы он ждал больше строк. Это возможно в php?

Ответы [ 4 ]

1 голос
/ 11 августа 2009

это всего лишь предположение, но попробуйте пропустить (passthru) вывод "tail -f".

но вам нужно будет найти способ очистить () ваш буфер.


ИМХО, гораздо более удачным решением было бы создание ajax-сайта.

прочитать содержимое файла в массив. сохранить количество строк в сеансе. распечатать содержимое файла.

запускать ajax-запрос каждые x секунд к скрипту, который проверяет файл, если число строк больше, чем число сеансов, добавьте результат на страницу.


Вы можете использовать popen () inststed:

$f = popen("tail -f /where/ever/your/file/is 2>&1", 'r');
while(!feof($f)) {
    $buffer = fgets($f);
    echo "$buffer\n";
    flush();
    sleep(1);
}
pclose($f)

сон важен, без него у вас будет 100% процессорного времени.

0 голосов
/ 13 августа 2009

Вы также можете использовать filemtime: вы получаете метку времени последней модификации, отправляете выходные данные и в конце снова сравниваете сохраненную filemtime с текущей.

В любом случае, если вы хотите, чтобы скрипт запускался одновременно с браузером (или клиентом), вы должны отправить вывод, используя чанки (fread, flush), а затем проверить все изменения в конце. Если есть какие-либо изменения, заново откройте файл и прочитайте с последней позиции (вы можете получить позицию вне цикла while(!feof())).

0 голосов
/ 12 августа 2009

Я решил это.

Хитрость заключалась в том, чтобы использовать fopen, а когда eof достигнут, переместить курсор в предыдущую позицию и продолжить чтение оттуда.

<?php
$handle = fopen('text.txt', 'r');
$lastpos = 0;
while(true){
   if (!feof($handle)){
       echo fread($handle,8192);
       flush();
       $lastpos = ftell($handle);
   }else{
       fseek($handle,$lastpos);
   }
}
?>

Тем не менее потребляет довольно много ресурсов процессора, но не знаю, как это решить.

0 голосов
/ 12 августа 2009

На самом деле, когда вы «эхо» это, он идет в буфер. Итак, вам нужно «добавить» новый контент, если он добавлен, когда браузер все еще получает вывод. И это невозможно (но есть некоторые подходы к этому).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...