Коллеги, прошу помощи по казалось бы совсем элементарной проблеме. С очередями работаю впервые, и все вроде бы работает как надо, но есть проблема с данными. Суть вопроса - установлен Gearman, в воркере одна функция, получает от клиента массив слов, эти слова должен проверить в другом массиве (общий массив фраз, примерно около миллиона) (сейчас он достается из csv) так вот, если в этом массиве найдено хоть одно слово, то этот элемент массива надо удалить, чтобы в других задачах он уже не участвовал. Простейший пример:
// Client
$client = new \GearmanClient();
$client->addServer();
$results = new \StdClass();
$results->value = [];
for ($i = 0; $i < 1000; $i++) {
$words = []; // вот тут рандомное количество слов
$client->addTaskHigh("find", json_encode($words), $results, $i);
}
$client->runTasks();
// Worker
$worker= new GearmanWorker();
$worker->addServer();
$phrases = // массив, данные берутся из csv файла
$worker->addFunction("find", "findPhrases", $phrases);
while ($worker->work());
function findPhrases($job, &$phrases) {
$words = json_decode($job->workload(), true); // слова, полученные от клиента
// вот тут то и надо удалить в массиве $phrases все элементы, в которых найдены слова из массива $words
}
Проблема в том, что воркер запускаю к примеру 5 раз через supervisor, и в каждом воркере должен быть актуальный массив с фразами. Пока есть только одна идея - хранить массив фраз в memcached/redis, только все равно не знаю как сделать так, чтобы там данные были актуальные, не циклические запросы же делать? Одна задача выполняется 30-90 секунд.