БАЗА ДАННЫХ ЗАПИСЬ

Главные вкладки

Аватар пользователя aman1792 aman1792 16 января 2015 в 17:40

Пишу свой модуль телефонии, есть вопрос как записать большое количество записей в бд! При загрузке обработчика который начинает записывать данные происходит следующее записывается 22 к файлов а потом Maximum execution time of 240 seconds exceeded in
а записало тока за полтора года , ещё надо 2.5 записать, вызываю функцию обработчика через крон
function module_phone_cron() {
module_phone_connect_bd();
}
Возможно ли файлы записать за один раз? либо инные варианты Lol

Комментарии

Аватар пользователя aman1792 aman1792 19 января 2015 в 17:57

orion76 + спасибо воспользовался вашим советом!
$receive_folder = ftp_nlist($conn_id, ""); // содержит название папок (получение папок)
$add_place = DrupalQueue::get('all_phone_folders'); // добавление в очередь
foreach ($receive_folder as $name_folder) {
if ($name_folder === '.' || $name_folder === '..') {
continue;
}
$add_place->createitem($name_folder);
}
}
Как сделать проверку , существует ли такая запись? то есть когда он все папки с файлами добавит , он заново пойдёт добавлять очередь которые уже добавлены

Аватар пользователя Orion76 Orion76 19 января 2015 в 19:17

Чтобы понять назначение и логику Вашего модуля, недостаточно данных.
Поэтому пососветовать что-либо однозначно правильное сложно.
Если файлов не особенно много, сохраняйте их статусы в variable_set.
Если файлов много, создайте таблицу в БД для Вашего модуля.
Можно еще в кэше хранить(cashe_set)..

Короче, вариантов куча-)

Аватар пользователя aman1792 aman1792 10 ноября 2015 в 11:50

Модуль который делает запрос на фтп сервер получает файл типа 201210291843-15332-121.mp3 1. дата 2. логин это провайдер присылает такого типа файл, логин это внутренний номер (подставляет провайдер 153) в компании( кто проивзёл звонок ) звонок 3. внутренний номер (кто принял звонок)
что есть на данный момент я запрашиваю через фтп этот файл и закидываю его в обработчик разбивая его на несколько частей
1.2012-10-29 дата 2.18:43 время 3. 15332 логин - 132 внутренний номер если у нас в компании есть такой логин - (внутренний номер)
то присваиваю ему id юзера совершивший звонок 4. id(кто произвёл звонок) 5. внутренний номер(кто принял звонок) если есть такой в компании зарегистрированный пользователь с таким внутренним номером присваиваю ему id юзера приневший звонок 6.id (кто принял звонок) 7. время разговора и 8. комментарии к звонку и записываю это в бд в таком виде
теперь все просто , к каждому юзеру криплю свою запись ! вся суть задачи!
ЦЕЛЬ!!! Теперь что осталось доделать как писал выше сделал очереди , теперь суть такова в очереди стоят 100 папок за определенный время допустим 2012-10.29, 2012-10-30 и.т.д. как сделать проверку если все записи с 2012-по 2014 записаны и уже идут записи за 2015 чтобы он не ставил в очередь папки которые уже были записанны , а так же крон запускается каждые пол часа и в очередь он ставит папки а не файлы если в папку 2015-01.21 добавилась запись он должен добавить этот файл

мысли такие что в очередь начать ставить не папки а файлы тогда он будет получать данные о всех файлах которые добавились ( забыл написать файлы падают на фтп каждые пол часа , поэтому и крон запускается каждые пол часа) чтобы все записи сразу крепились, тока успеет ли создать такую большую очередь сейчас файлов примерно 60к+ через год их может стать 100к+

Аватар пользователя Orion76 Orion76 21 января 2015 в 14:08

Да.. наверное в очередь лучше ставить файл, а не папку..

Может я что-то не понял, но проблемы не вижу..-))
СОхраняйте в базу так же статус файла:
1.Загружен на сервер.
2.Поставлен в очередь
3.Обработан

При работе с файлами обновляйте статусы, составляйте необходимые выборки из БД..
Выборки нод удобно делать вот-этой штукой https://www.drupal.org/node/1343708

Аватар пользователя aman1792 aman1792 29 января 2015 в 11:17

Ну вообщем решил сам ) если интерестно
$ftp_dir_list_info = parsed_listing($conn_id, ""); // получение данных когда файл последний раз был изменён)
foreach ($ftp_dir_list_info as $dir_info) {
if ($dir_info['name'] == 'aspnet_client') {
continue;
}
// Previous moderation date.
$prev_mod_date = db_query("SELECT modification_date FROM modification_folder WHERE name_folder = '" . $dir_info['name'] . "'")->fetchField();
if ($prev_mod_date) {
// ФАЙЛ ЕСТЬ - ПРОВЕРЯЕМ ДАТУ МОДИФИКАЦИИ ИЗ БД
if ($prev_mod_date == $dir_info['date']) {
continue;
} else {
// Если у папки была изменина дата модификации то сделать апдейт в бд этой папки и добавить в очередь
db_update('modification_folder')
->fields(array('modification_date' => $dir_info['date']))
->condition('name_folder', $dir_info['name'])
->execute();
}
} else {
// Если файла в БД нема! ТО пишем его БД!
$data_folder = db_insert('modification_folder'); // запись в бд
$data_folder->fields(array(
'modification_date', // дата модификации
'name_folder', // имя папки
'status_processing' // Статус папки 1. Обработана 0. поставить в очередь
), array(
$dir_info['date'],
$dir_info['name'],
0
));
$data_folder->execute();
}

$add_place = DrupalQueue::get('all_phone_folders');
$interval = variable_get("time_fortnight", 0);
$add_place->createitem($dir_info['name']);
variable_set("time_out", time() + $interval);
}
}
Заранее сори за название переменных )) тока получилось написать а так работает как надо