1. Насчет крона я думал, но все упирается в то, что задача у меня может выполняться несколько минут, тогда к моменту следующего запуска крона, она еще может быть не выполнена.
2. С локом это да, согласен ) Но это просто черновик, поэтому на создаваемую нагрузку особо не смотрел. Да и Анатолий выше подсказал решение.
5. Опять же, это черновик )
7. Согласен
8. Это я код не очень удачно обрезал, когда данный вопрос писал. Воркер переписал подобным образом: notepad.cc/pusucto98
Я хотел сделать так без доп либ, на пхп:
Всегда работает 5 независимых процессов - воркеров, каждый из которых берет свободную задачу и выполняет, задачи могут выполняться долго, поэтому и понадобилось несколько процессов. Затем как задачу выполнил, запрашивает еще задачу, если их нет, то засыпает на XX секунд. И так делает каждый воркер. И все это долго и безупречно работает, как владыка Путин... но нет, как сказал бы подвладыка Медведев : Ничего не работает, здоровья, удачи!
Такое ощущение, что слипы мешают, но я не понимаю почему, ведь запускаю из консоли, т.е. по времени не ограничены и процессы вроде как независимы. Но делают они что-то странное и почему-то не обновляют время лока:
Воркер берет задачу, отдает таску, такс ее выполняет и в самом конце должен обновить метку времени, но он этого почему-то не делает ...
Анатолий: Я если честно перестал понимать о чем вы ... вы мне подсказали замечательное решение без локов, которое я понял так:
Теперь воркер выглядит так:
public function worker($pid) {
while ( ! $this->stop ) {
$this->db->query( "UPDATE " . PREFIX . "_tasks
SET `lock` = '1', `lock_pid` = '{$pid}'
WHERE `lock` = '0' AND `lock_next` <= '" . date( "Y-m-d H:i:s" ) . "'
LIMIT 1" );
if ( $this->db->get_affected_rows() ) {
$row = $this->db->super_query( "SELECT `id` FROM " . PREFIX . "_tasks WHERE `lock` = '1' AND `lock_pid` = '{$pid}' LIMIT 1" );
if ( $row['id'] ) {
// Передаем задачу менеджеру задач
$task = new Tasks;
$task->run( $row['id'] );
Анатолий: Я вас вроде правильно понял:
Удаляю LOCK TABLES
Удаляю UNLOCK TABLES
У воркера удаляю select свободного таска, вместо него сразу делаю update limit 1 с каким-то параметром и смотрю на результат, если затронута одна запись, то все, работаю дальше, запрашиваю эту запись и т.д.
А слипы мне нужны.
Спасибо, такой реализации join так же не знал.
условие OR не подходит, мне нужно чтобы выбрались item_id, соответствующие всех параметрам из полученного массива, т.е. у него обязательно должен быть property_id =2 со значениями (3,5) и Property_id = 1 со значением 4
В вашем же запросе, так же будет выбран item_id = 2, т.к. он попадает под условие - or
(Property_id = 1 and value_id = 4) ... но он не должен попасть в выборку, т.к. у него нет - (property_id =2 and value_id in (3,5))
Спасибо, такое решение сейчас и используется, думал можно без join'ов обойтись.
А как вы думаете, не лучше таким запросом:
SELECT `item_id`, `property_id`, `value_id` FROM `table` WHERE `property_id` IN (2,1) AND `value_id` IN (3,5,4)
А затем уже через php отсеивать лишние item_id?
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.