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


Запуск вычисления в таблице из cron

cron вычисление

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

#1 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 11 Январь 2020 - 11:09

В таблице есть достаточно сложное вычисление которое невозможно целиком перенести в cron, но необходимо его периодически выполнять. Сейчас выхожу из ситуации с помощью запуска в cron data_update и флага EVENTS_ENABLE. В таблице настроено срабатывание вычисления на изменение поля. Все работает, но кривизна костыля напрягает. Есть ли более правильное и изящное решение запуска конкретного вычисления через cron?

#2 CbCoder

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

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

Отправлено 15 Январь 2020 - 17:12

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

#3 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 09 Февраль 2020 - 10:51

Какие еще события кроме изменения поля можно инициировать через крон?

И второй вопрос –
Всё это надо вот для чего – внешнее приложение изменяет напрямую данные в DB, КБ естественно ничего про это не знает, но при изменении данных необходимо запускать обработки внутри КБ. Можете подсказать какое-то решение для этого?

#4 Tony999

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

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

Отправлено 11 Февраль 2020 - 08:46

Создаете в КБ новое задание крон, пишете там вычисление, штатными функциями КБ обращаетесь к БД, проверяете это самое поле.... а потом запускаете свою обработку. Вот и все!
Умные сайты на заказ
https://info.crm-master.info

#5 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 11 Февраль 2020 - 12:46

Штатными средствами КБ я не смогу определить было ли изменено значение в поле, если например один текст был заменен на другой. Только если держать дубликат и сравнить, но это криво, полей может быть много.

#6 Tony999

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

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

Отправлено 14 Февраль 2020 - 00:30

Да почему же нет?
Создаете вычисление на изменение поля "Название".

if ($line['Название'] != $event['changed']['478']['old'])
echo "Название было изменено"; // 478 - это номер поля "Название"

Сообщение отредактировал Tony999: 14 Февраль 2020 - 07:41

Умные сайты на заказ
https://info.crm-master.info

#7 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 14 Февраль 2020 - 10:21

Это будет работать только если менять 'Название' из самой КБ, а у меня данные меняются напрямую в DB внешним приложением.

#8 Tony999

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

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

Отправлено 15 Февраль 2020 - 11:23

Ок.
Ваше внешнее приложение меняет в DB поле "Название", при этом еще поле "Флаг" ставит в 1.
Крон каждую минуту проверяет таблицу, если поле "Флаг" = 1, то делает соотв. обработку этой конкретной записи, затем сбрасывает поле "Флаг" в ноль.
Вот и все. Система готова к новому поиску изменений в поле "Название".
Умные сайты на заказ
https://info.crm-master.info

#9 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 15 Февраль 2020 - 22:05

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

#10 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 09 Апрель 2020 - 16:20

Вопрос к разработчикам -
Использование подобных конструкций чему-то противоречит? Вы не предлагаете подобного решения, а это как раз то что нужно, о чем собственно сабж и был.
$task = 'updater';
$params = ['table_id' => 221, 'calc_id' => 3670, 'filter_id' => '0'];
new ClientBase\calculate\Calculate($task, $params);


#11 CbCoder

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

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

Отправлено 21 Май 2020 - 15:44

Просмотр сообщенияAnton1 (09 Апрель 2020 - 16:20) писал:

Вопрос к разработчикам -
Использование подобных конструкций чему-то противоречит? Вы не предлагаете подобного решения, а это как раз то что нужно, о чем собственно сабж и был.
$task = 'updater';
$params = ['table_id' => 221, 'calc_id' => 3670, 'filter_id' => '0'];
new ClientBase\calculate\Calculate($task, $params);

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

#12 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 22 Май 2020 - 07:08

Не понял почему одноразовый, у меня в кроне работает по расписанию, все ок. Плюс позволяет использовать созданный в таблице фильтр и у него возможности гораздо богаче, чем условия которые можно задавать в вычислении.
Событие "по расписанию" да, появилось, но фильтр слабоват.
И фильтры в вычислении работают очень медленно. Например у меня табличка с 40к строк. Если сделать в ней фильтр, в который попадает, ну пусть десяток строк, то содержимое выводится мгновенно, но если я делаю вычисление с такими же условиями, то обработка идет в 3 захода по 30 секунд, а на больших таблицах приходится ждать очень долго. Если в таблице 10к строк, то обрабатывается в один проход. Что-то с алгоритмами у вас не оптимизировано.





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

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