Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2013, 20:40   #1
wingblack
 
Регистрация: 07.05.2013
Сообщений: 3
По умолчанию Логер чата и недопущение дублей в логах.

В рамках изучения PHP пишу свой мини-велосипед для сохранения логов чужого чата, столкнулся с парой проблем:
1) автономность - скрипт сохранения новых сообщений чата нужно выполнять минимум раз в две секунды, а имея обычный хостинг можно запустить скрипт максимум на 30 секунд (если зациклить), на хостинге есть cron, но его можно запускать лишь раз в минуту, а таким образом теряются сообщения отправленные в оставшиеся 30 секунд.
Временно решено задействованием своей машины (24/7 теоретически), с которой постоянно идут обращения к скрипту.
2) как результат решения предыдущей проблемы имеются случаи дублирующих записях в логах, предположительно в случаях когда скрипт запускается два раза подряд(почти одновременно).

Вот моя неуклюжая попытка обойти дублирование записи.
PHP код:
// last.log хранит последнее сообщение
$lastlog file_get_contents('last.log');

$contents file_get_contents('http://****/chat.php');
                                                            
$array json_decode($contents,1);
$arraysize count($array);

file_put_contents('last.log'json_encode($array[$arraysize-1]), LOCK_EX  );

for(  
$i=$arraysize$i 0  ;$i-- )
{
  if (
$lastlog == json_encode($array[$i-1]) )
  {      
      break;
  }    
}   ;

for( 
$j=$i $j<$arraysize $j++ )
{
   
$date date('Y-m-d'$array[$j]['time']).'.log';
   
file_put_contents('logs_back/'.$datejson_encode($array[$j]) . "\n" FILE_APPEND LOCK_EX );  
          
}   ; 
wingblack вне форума Ответить с цитированием
Старый 08.05.2013, 12:28   #2
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

я тебе предлагаю такой алгоритм, нужно подрубить под свою структуру чата.
PHP код:
$last_log=file("last.log"); // last.log хранит [U]последнее состояние чата[/U]
$last_message=array_pop($last_log); // последнее сохраненное сообщение

$add_new=array();
$contents=file("http://****/chat.php");
foreach(
$contents as $str){
    
// если сообщение совпало с последним сохраненным, опустошаем массив и дальше будем набивать его новыми строками
    
if($str==$last_message$add_new=array(); 
    else 
$add_new[]=$str;
}

file_put_contents("logs_backup""\n".implode("\n"$add_new), FILE_APPEND);
file_put_contents("last.log"implode("\n"$add_new)); 
если чат не особо активный, то можно еще проще сделать:
PHP код:
$last_log=file_get_contents("last.log"); // last.log хранит [U]последнее изменение чата[/U]
$contents=file_get_contents("http://****/chat.php");
$new=explode($last_log$contents);

file_put_contents("logs_backup"$new[1], FILE_APPEND);
file_put_contents("last.log"$new[1]); 
Mortimoro вне форума Ответить с цитированием
Старый 08.05.2013, 13:35   #3
wingblack
 
Регистрация: 07.05.2013
Сообщений: 3
По умолчанию

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

Да, и тут проблема не так уж в активности чата, а в правильном методе разруливании совместного доступа к файлам несколькими (или повторными запусками одного и того же) скриптами.

PHP код:
$new=explode($last_log$contents); 
за это отдельное спасибо
wingblack вне форума Ответить с цитированием
Старый 09.05.2013, 16:49   #4
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

если ты закомментируешь последнюю строку, то да, он будет не только по два раза дублировать, а до тех пор, пока ты не изменишь last.log, например, другим скриптом. В обоих вариантах последняя строка пишет в last.log последнее состояние чата и даже если ты запустишь выполнение скрипта немедленно после предыдущего выполнения, никакого дубляжа не будет.

во втором скрипте может возникнуть проблема, если более старая часть сохраненного состояния чата успела исчезнуть до следующего выполнения скрипта, тогда будет дубляж - этот вариант канает только для чатов, в которых за время простоя скрипта произойдет всего несколько изменений.

в первом скрипте мы извлекаем последнее сохраненное сообщение, игнорируем его и предыдущие, а все последующие записываем в массив, из которого добавляем в лог без всяких дубляжей и обновляем last.log... единственное, что я здесь не совсем грамотно сделал - записываю в last.log кусок чата (который может оказаться довольно большим), а потом уже по надобности извлекаю последнюю строку... лучше выделить последнюю строку из последнего изменения чата и записать в last.log только ее, без лишнего текста.

если сообщения в чате висят хотя бы 10 минут, то скрипт можно запускать вообще раз в 5-8 минут для сбора последних обновлений и все будут довольны.
Mortimoro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку. В логах не выдает. IHaveAPussy Общие вопросы Delphi 9 10.01.2013 23:14
Удаление дублей timon132009 Помощь студентам 1 01.05.2012 14:07
удаление дублей Bape}l{ka Microsoft Office Excel 7 01.07.2011 11:50
Помогите разобраться в логах bionicle Общие вопросы C/C++ 2 28.07.2010 11:01
Удаление дублей 777grabber PHP 4 11.11.2009 17:21