У меня проблема с очередью в pheanstalk (версия: 3.0.2). В очереди 0-10 тыс. Заданий, и иногда я должен искать данные в этой очереди и добавлять следующие задания. Поэтому я хочу добавить вакансии, которые не существуют.
В классе Pheanstalk я не вижу метод, который ищет работу, и не перемещает эту работу в «current-jobs-reserved».
Поэтому мне нужен быстрый метод, который только читает данные в работе без резервирования.
Мой пример:
public function searchId($id)
{
$pheanstalk = $this->getPhenstalk();
while ($job = $pheanstalk->reserveFromTube(self::TUBE)) {
$json = $job->getData();
$data = json_decode($json, true);
if($data['id'] == $id){
return true;
}
$pheanstalk->release($job);
}
return false;
}
Но relayse () нужно много времени. Как я могу это сделать?
Как в ‘Как я могу получить список всех работ в трубочном бобе?‘ ответ, Beanstalkd не является массивом. Он не предназначен для поиска, просто для того, чтобы получить следующую работу.
То, что вы делаете с массовым резервом / выпуском, просто помещает их обратно в очередь, вполне возможно, что это будет следующая вещь, которую вы зарезервируете, и так далее в бесконечном цикле.
Если вы хотите увидеть, находится ли конкретное задание / имя / идентификатор задания в очереди, запишите это в другом месте, в другом хранилище данных — например, Redis или memcached. Сделайте запись, когда вы поместите работу в очередь, и удалите ее, когда работа была удалена из Beanstalkd.
Других решений пока нет …