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
Форумы портала PHP.SU :: Версия для печати :: Алгоритм переключения таблиц
Форумы портала PHP.SU » » Работа с СУБД » Алгоритм переключения таблиц

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

1. Haron - 27 Августа, 2015 - 18:03:58 - перейти к сообщению
Здравствуйте

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

Имеем базу данных: В базе данных находятся таблицы, причём на каждый день таблица своя. Имена таблиц имеют вид 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.  


Задача: Реализовать переключение скрипта на новую таблицу, в полночь (при смене дня), без потерь данных. Задача нетривиальная, и простая лишь на первый взгляд Улыбка. Я вот голову сломал.
2. Мелкий - 27 Августа, 2015 - 18:09:59 - перейти к сообщению
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.  

(Добавление)
И начальные значения переменных обычно перед циклом ставят. Чтобы не засорять сам цикл ненужными условиями.
3. Haron - 27 Августа, 2015 - 18:33:22 - перейти к сообщению
Как всё элементарно оказывается... Устал я видимо, сильно.

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


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

 

Powered by ExBB FM 1.0 RC1