Помогите советом новичку ,плз.

Есть текстовый файл 1.txt этот файл формируется функцией php и обновляется раз в минуту . Нужно с помощью Jquery обновлять div на странице содержимым текстового файла ..при этом обновлять только тогда когда данный файл полностью дописан Все что нашлось в поисковике работать не стало а времени на мануал катастрофически не хватает .. Сорри за банальность ... Буду благодарен за ссылки на рабочий код и любую помощь..
8 ответов

Что значит
обновлять только тогда когда данный файл полностью дописан
?


А получить содержимое файла можно попробовать через .load() (точно не знаю, не пробовал).


когда полностью дописан имелось ввиду чтобы не вывести на страницу текст из тхт когда файл тхт переписывается ( обновляется) потому как текст в нем вместе с тегами и если он не будет дописан то страница будет кривая ...


Ну я думаю, что если файл открыт в PHP, в момент подключения к нему на JS, то он по идее не будет доступен.


Ну я думаю, что если файл открыт в 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 используется в начале скрипта, как у нас.


Огромное спасибо за подробный ответ!! Поковыряю на досуге в этом направлении )