Перейти к содержимому


CRON Ошибка


Сообщений в теме: 3

#1 TelecomMedia

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

  • Пользователи
  • PipPipPip
  • 378 сообщений

Отправлено 17 Сентябрь 2018 - 16:29

Возникает такая ошибка в кроне. В чем может быть причина?

2018-09-17 16:12:13 - OneTime - Task terminated
<br />
<b>Fatal error</b>: Allowed memory size of 536870912 bytes exhausted (tried to allocate 395974400 bytes) in <b>/home/intertorg/public_html/include/sql_functions.php</b> on line <b>69</b><br />

Сам скрипт

$result = data_select(711, "status=0"); // цикл по всем активным записям таблицы Наши сотрудники
while ($line = sql_fetch_assoc($result)){
/*
* Отправить текущую запись в реестр СушиМастер
* 1. Добавляем запись с нужынми полями в таблицу реестра
* 2. Обнуляем поля кроме телефона, города и группы
* 06.09.2018
*/



/*1*/
$newData['Телефон'] = $line['f15541'];
$newData['Группа'] = $line['f15571'];
$newData['Город'] = $line['f15581']['id'];
$newData['Канал отправки'] = $line['f15551'];
$newData['Статус сообщ.'] = $line['f15561'];
$newData['Дата обновления статуса'] = $line['f15611'];
$newData['Статус'] = $line['f15621'];
$newData['Время отправки'] = $line['f15881'];


if($line['id'] >= '1240379' && $line['f15621'] == 'Есть отчет' && $line['f15611'] != ''){
insert_query($newData, 'СушиМастер (реестр)');
}
/*2*/

/*
$line['Канал отправки'] = '';
$line['Статус сообщ.'] = '';
$line['Дата обновления статуса'] = '';
$line['Статус'] = '';
$line['Время отправки (по МСК)'] = '';
*/

}

#2 CbCoder

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

  • Программист ООО "КБ"
  • PipPipPip
  • 8 687 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 18 Сентябрь 2018 - 13:19

А много ли записей в таблице? Задача вылетает из-за нехватки памяти. Плюс у вас ошибка - не $line['f15581']['id'], a $line['f15581'], здесь поля связи не разворачиваются.

#3 TelecomMedia

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

  • Пользователи
  • PipPipPip
  • 378 сообщений

Отправлено 18 Сентябрь 2018 - 15:28

Просмотр сообщенияCbCoder (18 Сентябрь 2018 - 13:19) писал:

А много ли записей в таблице? Задача вылетает из-за нехватки памяти. Плюс у вас ошибка - не $line['f15581']['id'], a $line['f15581'], здесь поля связи не разворачиваются.

Да, записей больше 1.2 млн.
А как нам тогда разбиение провести правильно?

Так?
$result = data_select(711, "status=0 AND id<'1000'"); // цикл по всем активным записям таблицы Наши сотрудники
while ($line = sql_fetch_assoc($result)){
/*

#4 AntonKravchenko

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

  • Пользователи
  • PipPipPip
  • 137 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород

Отправлено 18 Сентябрь 2018 - 19:27

* делайте выборку не всех полей, а только нужных - функция data_select_field(ID_таблицы, 'id, fXXXX, fXXXX', "status=0");
* отмечайте дату обработки этой задачи cron в карточке, и ставьте условие в выборке, чтобы эта дата была ранее ХХ часов назад, и ставьте лимит в выборке. Итого - будете обрабатывать по N записей, сортируя их по дате последней обработки (пакетно)
* возможно, тут нужна оптимизация на уровне логики построения кода - действительно необходимо регулярно обрабатывать все 1.2М записей?

Сообщение отредактировал AntonKravchenko: 18 Сентябрь 2018 - 19:30






Количество пользователей, читающих эту тему: 3

0 пользователей, 3 гостей, 0 анонимных