Помогите советом новичку ,плз.
Есть текстовый файл 1.txt этот файл формируется функцией php и обновляется раз в минуту .
Нужно с помощью Jquery обновлять div на странице содержимым текстового файла ..при этом обновлять только тогда когда данный файл полностью дописан Все что нашлось в поисковике работать не стало а времени на мануал катастрофически не хватает .. Сорри за банальность ... Буду благодарен за ссылки на рабочий код и любую помощь.. |
Что значит
Цитата:
|
А получить содержимое файла можно попробовать через .load() (точно не знаю, не пробовал).
|
когда полностью дописан имелось ввиду чтобы не вывести на страницу текст из тхт когда файл тхт переписывается ( обновляется) потому как текст в нем вместе с тегами и если он не будет дописан то страница будет кривая ...
|
Ну я думаю, что если файл открыт в PHP, в момент подключения к нему на JS, то он по идее не будет доступен.
|
Цитата:
|
Cron который будет запускать скрипт генерации каждую минуту, и работать в холостую даже если вдруг на сайте не окажется посетителей, это идея расточительная в плане ресурсов сервера.
В твоём случае предпочтителен что то вроде следующего алгоритма. Клиент обращается к файлу txtgen.php txtgen.php смотрит когда в последний раз был создан текстовый файл. если больше минуты назад: Значит он создаёт этот файл и только потом возвращает данные из него. Если меньше минуты назад тогда он возвращает содержимое уже существующего файла. Если файл в процессе изменения тогда он возвращает служебное сообщение, к примеру текст "wait". Преимущества этого подхода очевидны. Текстовый файл формируется только тогда когда он действительно нужен, а не молотит в холостую всегда. На клиенте скрипт приблизительно будет выглядеть так f=function(){ $("#target").load("txtgen.php",function(){ setTimeout(f,60000); }); } f(); Скрипт с возможностью обработки ожидания примерно так f=function(){ $.get("txtgen.php",function(data){ // если нас просят подождать подождём 2000мс и попробуем снова. if (data=="wait"){ setTimeout(f,2000); } // если нам вернули данные то вставим их в див и заберём следующие через минуту. else { $("#target").html(data); setTimeout(f,60000); } }); } f(); Php в лом расписывать. Напишу псевдокодом. $time=getFileTime();// Эту функцию пишите сами она забирает из какой нибудь таблицы данные о времени создания файла. // файл как раз сейчас пишут, попросим клиента подождать ;) if ($time==0) echo "wait"; // Прошло меньше минуты, значит достаточно вернуть содержимое файла. else if ($time+60>time() ) { // читаем файл в переменную txt; // .... //выводим то что прочитали echo $txt; // неуверен но может быть достаточно встроить файл через include, вроде должно быть быстрее чем чтение } // прошло больше минуты, нужно сгенирировать файл else { setFileTime(0);//(эту функция пишите сами) на время генерации пометим файл как находящийся в процессе перезаписи // здесь мы генерируем файл, копия файла должна оказаться в переменной $txt, либо выводить сразу echo по строчке // .... setFileTime(time());//(эту функция пишите сами) после того как файл готов, сохраним в базу время создания echo $txt; } //setFileTime и getFileTime это функции в которых я инкапсулировал работу с состоянием файла, // я вижу это как сохранение и чтение из базы данных числового значения в таблице. Числовое потому что функция time //возвращает количество секунд прошедших от какой то то там даты вроде от 1970 года )) . PS. В сессию писать состояние файла бессмысленно во первых потому что файл общий для нескольких сессий, во вторых данные в сессии будут недоступны другому процессу этой сессии, пока будет активен процесс генерации файла. Именно по этому я пишу состояние в бд, однако это не означает что нельзя придумать другой способ хранения данных. К примеру можно черпать информацию о создании файла из файловой системы. А вот где зафиксировать факт начала записи кроме бд, я затрудняюсь ответить. Хотя можно файл переименовывать но это как то уж шибко криво. С бд как то попроще. |
Я заинтерисовался запиранием файлов. Вот что нарыл.
функция запирания http://www.php.su/functions/?flock а вот здесь чувак изо всех сил пытается использовать эту функцию, только у него не фига толкового не получается ). Поэтому в итоге он как и я, использует некий триггер,только я пишу в бд , а он в файловую систему . Недостаток в том что он останавливает скрипт в цикле в случае недоступности файла, до того момента пока файл ни будет доступен. А в хорошо спроектированной системе, ситуации холостого хода возникать не должны. Ибо холостой ход тоже тратит процессорное время. Утро upd: Поправка, не совсем верно раскритиковал решение чувака. В его решении while(!$array=file($path)){sleep(1);} цикл исполняется раз в секунду, за счёт использования sleep, и не чаще. То есть решение в ряде случаев приемлимо, оно щадяще относится к процессорному времени, хоть и не жалеет память. Можно позаимствовать идею и изменить решение из 7го топика. вместо if ($time==0) echo "wait"; написать while($time==0){sleep(1); $time=getFileTime();} соответственно на клиенте использовать первый javascript пример а не второй, так как обработка wait на клиенте будет уже не нужна. Вопрос будет ли такое решение лучше ?. Думаю будет, но только если sleep используется в начале скрипта, как у нас. |
Огромное спасибо за подробный ответ!!
Поковыряю на досуге в этом направлении ) |
Часовой пояс GMT +3, время: 11:10. |