Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Алгоритм переключения таблиц

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Алгоритм переключения таблиц
Haron
Отправлено: 27 Августа, 2015 - 18:03:58
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Здравствуйте

Есть задача с подводными камнями. Суть такова:

Имеем базу данных: В базе данных находятся таблицы, причём на каждый день таблица своя. Имена таблиц имеют вид table_2015_08_21, table_2015_08_22, etc...
В таблицу, в реальном времени, валится непрерывный поток данных. Каждая таблица имеет первичный уникальный ключ id. На колонке автоинкремент. В пределах суток id естественно, всегда уникален.

Имеем некий скрипт: Задача скрипта, вытаскивать свежеупавшие в таблицу данные раз в 15 секунд. Данные затем идут на обработку куда-либо. Алгоритм извелечения данных работает следующим образом:

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. while(true)
  4. {              
  5.         // Первый запуск
  6.         if (!isset($start_id)
  7.         {
  8.                 $table = 'table_' . implode('_', explode('-', date('Y-m-d')));
  9.                 $start_id = 1;
  10.         }
  11.  
  12.         // Получаем порцию данных
  13.         $data = $db -> select('SELECT * FROM ' . $table . ' WHERE id >= ' . $start_id;
  14.         if ($data)
  15.         {
  16.                 $start_id = $data[count($data)-1]['id']
  17.                 // process_data($data);
  18.         }
  19.  
  20.         sleep(15);
  21. }
  22.  
  23.  


Задача: Реализовать переключение скрипта на новую таблицу, в полночь (при смене дня), без потерь данных. Задача нетривиальная, и простая лишь на первый взгляд Улыбка. Я вот голову сломал.


-----
И чё?
 
 Top
Мелкий Супермодератор
Отправлено: 27 Августа, 2015 - 18:09:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




PHP:
скопировать код в буфер обмена
  1. if ($data) {
  2. ...
  3. } else {
  4. // или обработали всё и день кончился или больше ничего пока не записали
  5. $new_table = 'table_' .  date('Y_m_d');
  6. if ($table != $new_table) {
  7. // новый день
  8. $table = $new_table;
  9. $start_id = 1;
  10. }
  11. }
  12.  

(Добавление)
И начальные значения переменных обычно перед циклом ставят. Чтобы не засорять сам цикл ненужными условиями.


-----
PostgreSQL DBA
 
 Top
Haron
Отправлено: 27 Августа, 2015 - 18:33:22
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Как всё элементарно оказывается... Устал я видимо, сильно.

Мелкий пишет:
И начальные значения переменных обычно перед циклом ставят


В реальном скрипте есть ещё один вложенный цикл, в котором имя данной переменной генерируется динамически. Поэтому за while() его не вынести.


-----
И чё?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB