Я хочу прочитать все из текстового файла и повторить его. Но в текстовом файле может быть больше строк, в то время как я читаю, поэтому я не хочу, чтобы скрипт вышел, когда он достиг конца файла, вместо этого я не буду ждать вечно для большего количества строк. Возможно ли это в php?Блокировка чтения файла в php?
ответ
Я решил.
Фокус в том, чтобы использовать 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);
}
}
?>
Все еще потребляет довольно много процессора, хотя, не знаю, как это решить.
Вы заняты циклом, конечно, он потребляет весь процессор. Попробуйте добавить 'usleep (50000)' после строки 'fseek'. Это будет спать в течение 50 мс, что значительно снизит использование вашего ЦП без заметного влияния на вашу задержку. Чтобы сделать еще лучше, вам нужно использовать inotify (при условии, что вы находитесь в системе, которая его поддерживает). – derobert
Да, я знаю, что это из-за цикла, работает, но я не являюсь поклонником сна-решений. inotify, хотя, похоже, именно то, что я искал, я буду смотреть на это завтра. – Martin
Это всего лишь догадка, но попытайтесь передать (passthru) выход «хвост -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% процессорного времени.
На самом деле я сделал решение с хвостом, который работает, но он использует бесконечный цикл, который потребляет весь процессор, поэтому я хочу какой-то «блокирующий» вызов. Вызов каждого X секунд не достаточно, мне нужно в реальном времени, и это не сайт, поэтому нет ajax. – Martin
'tail -f' - это« realtime »и не нуждается ни в петле, ни в php. – VolkerK
Это всплывающее решение почти точно похоже на мое. Проблема заключается в том, что сон задерживает слишком большую задержку. – Martin
Фактически, когда вы «эхо», он переходит в буфер. Итак, вы хотите «добавить» новый контент, если он добавлен, пока браузер все еще получает выход. И это невозможно (но есть некоторые подходы к этому).
Вы знаете, что есть флеш()? – Rufinus
Вы также можете использовать filemtime
: вы получаете последнюю временную метку изменения, отправляете результат и в конце сравниваете снова сохраненную filemtime
с текущей.
В любом случае, если вы хотите, чтобы сценарий работал одновременно с браузером (или клиентом), вы должны отправить вывод с помощью фрагментов (fread
, flush
), а затем проверить все изменения в конце. Если есть какие-либо изменения, повторно откройте файл и прочитайте его с последней позиции (вы можете получить позицию за пределами цикла while(!feof())
).
- 1. Блокировка чтения из файла в PHP
- 2. PHP блок файла от чтения
- 3. PHP JSON чтения файла
- 4. Ошибка чтения файла PHP
- 5. чтения в PHP Содержимое файла
- 6. Блокировка XML-файла во время чтения и записи в ASP.NET
- 7. Блокировка MQ замедляет программу чтения
- 8. Блокировка чтения-записи с GCD
- 9. Блокировка чтения базы данных Oracle
- 10. Блокировка силы чтения после EAGAIN?
- 11. Блокировка вызова для чтения трубки
- 12. PHP для чтения защищенного файла
- 13. Оптимизация кода чтения файла php
- 14. Ошибка чтения CSV-файла (PHP)
- 15. Блокировка чтения строк в буфере BufferReader?
- 16. Блокировка чтения из stdin в python
- 17. PHP MySQL и очередями, блокировка таблицы, устройство чтения/записи Проблема
- 18. Использовать php для чтения источника php-файла
- 19. Использование RewriteEngine в PHP для чтения файла
- 20. Наименее интенсивный способ чтения файла в PHP
- 21. Блокировка файла через службы
- 22. Постоянная блокировка файла
- 23. Блокировка внешнего файла JavaScript
- 24. PHPExcel - блокировка просматриваемого файла
- 25. Может ли блокировка предотвращать неповторимые чтения?
- 26. Блокировка чтения из входного сокета TCP
- 27. Non блокировка чтения на os.pipe на Windows,
- 28. Блокировка чтения-записи, необходимая для этого прецедента
- 29. Блокировка чтения из FIFO через объект ifstream
- 30. Почему для блокировки чтения/записи требуется блокировка?
Это зависит от типа функциональности, на которую вы стремитесь. Выполняется ли этот сценарий в контексте запроса, поступающего из браузера? Это CLI-скрипт, который может работать бесконечно? –
Является ли это скриптом PHP, который будет запускаться из командной строки или с веб-сервера? – Wade
Сценарий командной строки, но как это важно? – Martin