Показать сообщение отдельно
  #7 (permalink)  
Старый 14.04.2012, 23:18
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

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. В сессию писать состояние файла бессмысленно во первых потому что файл общий для нескольких сессий, во вторых данные в сессии будут недоступны другому процессу этой сессии, пока будет активен процесс генерации файла. Именно по этому я пишу состояние в бд, однако это не означает что нельзя придумать другой способ хранения данных. К примеру можно черпать информацию о создании файла из файловой системы. А вот где зафиксировать факт начала записи кроме бд, я затрудняюсь ответить. Хотя можно файл переименовывать но это как то уж шибко криво. С бд как то попроще.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 15.04.2012 в 01:04.
Ответить с цитированием