[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Множественный редирект специально - через PHP или
Страницы: 1, 2, 3
GET
Привет.

Был достаточно тяжелый скрипт обновляющий и объединяющий несколько служебных больших таблиц типа "А" для работы с таблицами типа "B" (их около 150, которые он перебирает в цикле, индексов по объединению нет поэтому тяжело или их придется создавать раз в сутки), по результатам он обновляет эти таблицы, удаляет картинки, возможно разный файловый мусор (это самое тяжелое - скан множества каталогов).

Запускается раз в сутки.


Для того чтобы он не тормозил и работал, как надо убрал цикл перебора таблиц. Теперь за один подход подключает только одну таблицу типа "B".

Реализовал через рекурсивную функцию JS + AJAX запрос, который отрабатывает таблицу "B" и если еще таблицы "B" остались запускается еще раз..

Но. Хочется прицепить его как на CRON.

Не могу придумать как это реализовать, единственное что приходит в голову это сделать множественный редирект (имитация рекурсии AJAX), т.е. каждый удачный проход вызовет редирект на этот же самый адрес + параметр.

Таких переходов может быть 150 - по количеству таблиц "B". Но это такое извращение! Есть же какие - то другие методы.

Рассматриваю еще работу через менеджер CRON через его ini можно тоже сделать, но пока не хочу туда лезть. К тому же хотелось бы чтоб соблюдалась последовательность, чтоб не началась обработка нового прохода пока не закончилась предыдущая да и не растягивалось так по времени.

Спасибо.

Может намудрил конечно, но не вылажу уже неделю из - за стола. Может решение вообще глупое.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
T1grOK
Цитата (GET @ 9.12.2016 - 14:25)
Но. Хочется прицепить его как на CRON.

Не могу придумать как это реализовать, единственное что приходит в голову это сделать множественный редирект (имитация рекурсии AJAX), т.е. каждый удачный проход вызовет редирект на этот же самый адрес + параметр.

При чем здесь редиректы как таковые? Редирект - в общем случае привилегия frontend-а.
Кто мешает на сервере, поставить скрипт на cron и вызывать его с необходимой периодичностью(да хоть каждую минуту). При запуске скрипт сохраняет информацию в файл или БД, что он запущен и находится на этапе "X", после завершения работы скрипта, сохраняется информация, что его работа закончена.
И вырисовывается алгоритм:
1) Запускаем скрипт
2) Проверяем, а не запущен ли уже процесс скрипта, на основе записи из файла/БД
3) Запущен - завершаем работу текущего скрипта, не запущен - отмечаем в файле/БД, что скрипт активен.
4) Скрипт закончил свое выполнение, отметили в файле/БД соответствующим статусом.


_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
killer8080
Цитата (GET @ 9.12.2016 - 18:25)
Может решение вообще глупое.

ну да user posted image
Цитата (GET @ 9.12.2016 - 18:25)
Для того чтобы он не тормозил и работал, как надо убрал цикл перебора таблиц.

напрасно, не нужно избавляться от цикла, нужно просто ввести небольшую задержку на каждой/или через n итераций
$i = 0;
$n = 5; // число итераций до задержки
$timeout = 100;

while(...) {
...
if (++$i % $n == 0) {
usleep($timeout);
}
}

параметры задержки подбираются экспериментальным путём, наблюдая за загрузкой CPU через htop. Слишком большая задержка - не оправданно длительная отработка скрипта, слишком маленькая - большая нагрузка на сервер, нужно найти компромисс.

UPD исправил
TranceIT
Цитата (killer8080 @ 10.12.2016 - 12:56)
параметры задержки подбираются экспериментальным путём, наблюдая за загрузкой CPU через htop. Слишком большая задержка - не оправданно длительная отработка скрипта, слишком маленькая - большая нагрузка на сервер, нужно найти компромисс.


Сегодня ты вычислил, а завтра на сервер еще один скрипт залили. Опять эксперементировать будешь? Удали, пока никто не видел.

GET
Оптимизацию я бы начал с того, что просто повесил бы все это на крон. Без изменений. А далее как говорится "гуляй рука - балдей писюн". Смотря какая гибкость нужна.

1) Я бы создал служебную таблицу управления.
2) Разделил бы все таблицы на 3-4 пула и по крону в несколько потоков обрабатывал и записывал результат во временную таблицу постепенно помечая в служебной какие таблицы уже обработаны. Если в железе ограничены - можно на пулы не разделять.
3) Рядом повесил бы скрипт который чистит "мусор". Как только скрипт видит что все таблицы обработаны он начинает скан.
4) Для этого скрипта я бы создал свою служебную таблицу где помечал бы отсканированные каталоги. Либо путем флага если структура каталогов известна, либо путем записи в таблицу.
5) Как только скан закончен - актуализирует данные в основной таблице и сбрасывает параметры в служебных таблицах.

В итоге:
1) Если пулов 2+ отработает быстрее (но с большей нагрузкой).
2) Скан не запустится, пока не обработаются таблицы.
3) Таблицы не обработаются пока не закончится скан.
4) Если произошел сбой обработка таблиц или скан продолжится с места где закончилась.
5) Под рукой всегда актуальные (близкие к актуальным в случае сбоя) данные.

_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
GET
T1grOK
killer8080
TranceIT

Спасибо, что отозвались!



T1grOK В том, то и дело, что так основное время CRON`у придётся запускаться вхолостую.


killer8080
Рассматриваю, этот вариант как основную версию замены AJAX`a.


TranceIT
Там 150 таблиц, разделить логику не получится. Там даже транзакции из-за этого чтоб она не прерывалась. Другими словами 150 запусков скрипта. Вопрос только в одном за раз (пусть даже с sleep) или частями, чтоб не плодить кучу процессов и пожалеть железо.


С CRON через простой php- header не получится т.к. он там просто не передается...

Думаю сейчас, как решу отпишусь!

Всем спасибо большое!

Кстати, вот тут на форуме дискус по той же теме, если любопытно:
С dklab...
http://forum.dklab.ru/viewtopic.php?p=99161


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
TranceIT
Цитата (GET @ 12.12.2016 - 10:56)
Там 150 таблиц, разделить логику не получится. Там даже транзакции из-за этого чтоб она не прерывалась. Другими словами 150 запусков скрипта.


Откуда 150 запусков то? Запускаем скрипт, получаем пул таблиц (в данном случае, как я понимаю, один). И вперед циклом. Итерации то в очередь становятся. Каждая итерация - обработка данных из одной таблицы.

UPD
Даже если делать без цикла. В служебной таблице делаем промежуточный статус и проверяем перед запуском, если есть таблицы со статусом processing - значит идет обработка, die. По крону хоть раз в секунду запускай...

_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
Guest
TranceIT
Ну вот допустим запускается раз в 5 секунд по крону, через 15 минут работа закончена, все таблицы очищены, работа сделана. Остальные 23 часа и 45 минут крон будет запускаться просто так, мне не кажется это правильным.

[GET]
TranceIT
GET
Запуская раз в 5 секунд скрипт

if (сегодня проверка уже была) {
die();
}


разницы ты не заметишь.

_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
Guest
TranceIT
Я понимаю, но дело не в этом. Ну не хочу я дергать каждые 5 секунд скрипт 24 часа в сутки (без 15 минут). Пытаюсь вот найти альтернативу.


В любом случае спасибо ещё раз.
TranceIT
Настрой крон на конкретное время и запускай 1 раз.

_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
Guest
TranceIT
В каком смысле?

Все в одном цикле будет?
Guest
Я же написал я хочу разделить всю работу на части по времени.
TranceIT
GET
Да это все лирика. При любом подходе сам скрипт по сути будет один и тот же.
В процессе сможешь понять что удобнее конкретно для тебя.
Может ты вообще придешь к тому, чтобы обрабатывать по 15 таблиц в час.

_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
killer8080
Цитата (TranceIT @ 12.12.2016 - 10:45)
Сегодня ты вычислил, а завтра на сервер еще один скрипт залили. Опять эксперементировать будешь? Удали, пока никто не видел.
Я же не предлагаю грузить CPU на 90%, на практике 1-5% достаточно для нормальной работы скрипта, и совершенно безболезненно для сервера. Надо запилить ещё один скрипт - нет проблем. Это уже вопрос планирования задач. В конце концов тяжелые задачи нужно разносить по времени, и запускать их в часы минимальной нагрузки на сервер, а не бездумно.

Цитата (TranceIT @ 12.12.2016 - 14:59)
Даже если делать без цикла. В служебной таблице делаем промежуточный статус и проверяем перед запуском, если есть таблицы со статусом processing - значит идет обработка, die.
ты еще забыл про дополнительный мониторинг, в случае аварийного завершения процесса в таблице так и зависнет processing и отвалится твой скрипт, и даже знать об этом не будешь wink.gif

Цитата (TranceIT @ 12.12.2016 - 14:59)
По крону хоть раз в секунду запускай...
у крона дискретность - минута wink.gif

GET
а ты смотрел сколько времени реально отрабатывает скрипт по полной, без этих костылей? Какова при этом нагрузка на CPU/MEM ?
GET
Цитата
Реализовал через рекурсивную функцию JS + AJAX запрос, который отрабатывает таблицу "B" и если еще таблицы "B" остались запускается еще раз..

Но. Хочется прицепить его как на CRON.


killer8080

Нагрузка пока не так велика, мне надоело каждый день открывать в админке страницу с этой ajax кнопкой, чтоб запустить процесс рассылки и уборки. Хотя благодаря рекурсии он очень экономичный и что самое главное контролируемый, каждый шаг анализируется, инфа с севера приходит в виде json и сбой на сервере или другой форс-мажор не пройдёт.


Я тут нащупал решение, просто отложил пока на пару дней. Как сделаю отпишусь.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.