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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Нужно что-то вроде Cron, но не он...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
NeuroZ
Отправлено: 12 Декабря, 2015 - 10:47:55
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Есть сайт доска объявлений. Пользователь, который размещает объявления, может в ЛК нажать на кнопку "поднять" и дата обновления объявление изменяется, и оно перемещается в самый верх списка объявлений.
Есть также кнопка "автоподнятие". При клике на нее, должен срабатывать скрипт, который будет автоматически, каждые 3 часа, поднимать объявление.

Если использовать крон с интервалом выполнения "каждый час", то в этом смысла не будет.
Например в 12:01:38 должна подняться реклама. Фактически она будет подниматься в 13:00, 14:00 и т.д.
Т.е. как бы первое автоподнятие срабатывает с погрешностью в час, а все остальные автоподнятия приравниваются к времени запуска скрипта.
Но это нас не устроит, т.к. в указанное время будут одновременно подниматься все объявления, которые стоят на автоподнятии.
Соответственно толку от такого автоподнятия - никакого.

А нужно сделать так, чтобы каждое объявление поднималось именно в свое указанное время. Желательно вплоть до секунд.
(Добавление)
Вариант который нашел в интернете - запустить скрипт через консоль командой nohup с & на конце предложения.

При этом внутри скрипта написать зацикливание с задержкой в секунду.
Подвергает сомнению лишь то, на сколько это загрузит сервак? Это приемлемый выход? Так вообще делают или есть более гуманный (для сервера) способ?

p.s. И еще не нашел инфы, что будет если перезагрузить сервер? Скрипт автоматически запуститься или его надо будет снова запустить в ручную через nohup?

(Отредактировано автором: 12 Декабря, 2015 - 10:49:41)

 
 Top
NeuroZ
Отправлено: 14 Декабря, 2015 - 08:37:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Однако
 
 Top
Мелкий Супермодератор
Отправлено: 14 Декабря, 2015 - 10:30:06
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Минутная точность - крон. Самое простое.

Если всё-таки нужна точность мельче - есть разные варианты.
Бесконечный цикл sleep(1) можно. Если вам проблема 1 qps, то у вас уже проблема в другом месте. При рестарте, разумеется, кто-то должен скрипт запустить снова. Плюс не забыть про возможность скрипта упасть внезапно самому. Затем, если делать именно sleep(1), то событие будет вызываться меньше 60 раз в минуту, это не всегда подходит.

Вариант следующий: поставить сервер очередей, умеющий отложенный запуск задач. В сервер очередей кидаете события, что во столько-то нужно что-то сделать. При наступлении события воркер делает работу и кидает туда же в очередь отложенную ещё на заданный интервал такую же задачу.

Поглядеть, что умеют сами субд: у mysql штатный шедулер, помнится, был.


-----
PostgreSQL DBA
 
 Top
NeuroZ
Отправлено: 14 Декабря, 2015 - 11:24:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Спасибо, очень помог ответ. Теперь есть куда покапать Улыбка
Пользуясь случаем, хочу уточнить 2 момента:
Мелкий пишет:
Плюс не забыть про возможность скрипта упасть внезапно самому.

А как в таком случае осуществлять проверку работает скрипт или нет?
Мелкий пишет:
поставить сервер очередей

А Вы что посоветуете? Он как виртуальный сервер ставиться или "сервер" - это просто такое название у него?
 
 Top
esterio
Отправлено: 14 Декабря, 2015 - 11:30:13
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




NeuroZ пишет:
как в таком случае осуществлять проверку работает скрипт или нет?

Supervisor как вариант
NeuroZ пишет:
А Вы что посоветуете? Он как виртуальный сервер ставиться или "сервер" - это просто такое название у него?

Мелкий иммел ввиду например RabbitMQ

Как вариант взгляните сюда
https://github[dot]com/treffynnon/PH[dot][dot][dot]ob-Queue-Wrapper
данное решение работает только на *nix (никаких Windows). это обертка над утилитой at
 
 Top
Мелкий Супермодератор
Отправлено: 14 Декабря, 2015 - 11:49:50
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




NeuroZ пишет:
А как в таком случае осуществлять проверку работает скрипт или нет?

Можно воспользоваться чем-нибудь общим, supervisord какой-нибудь.
Можно самостоятельно что-нибудь по типу pid-файлов понатыкать и периодически (опять крон, ага) проверять, доступен ли этот pid для posix_kill(0).

NeuroZ пишет:
Он как виртуальный сервер ставиться или "сервер" - это просто такое название у него?

Здесь в значении программы, серверной стороны клиент-серверного взаимодействия.
Я для очередей использовал только mbus - дополнение для postgresql. Для такой задачи не подойдёт, проще будет сразу пинать таблицы.
Gearman можно потыкать.

А посоветую не извращаться и оставить минутный допуск.


-----
PostgreSQL DBA
 
 Top
NeuroZ
Отправлено: 14 Декабря, 2015 - 12:25:19
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Мелкий пишет:

А посоветую не извращаться и оставить минутный допуск.

Да, с текущей задачей так и сделаю. Но инфа очень полезная для всеобщего обозрения. Может когда-нибудь пригодится Улыбка
(Добавление)
esterio пишет:

Как вариант взгляните сюда
https://github[dot]com/treffynnon/PH[dot][dot][dot]ob-Queue-Wrapper

Спасибо, интересная тема Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB