2015-10-08 2 views
0

У меня есть PHP демон работает:PHP Daemon с доктриной 2

while (true) { 
    $tasks = $this->tasksFinder->findDueTasks(); 
    foreach ($tasks as $task) { 
     try { 
      $handlerClass = $task->getHandlerClass(); 
      /** @var AbstractTaskHandler $handler */ 
      $handler = new $handlerClass(...$task->getArguments()); 
      $handler->setEntityManager($this->getEm()); 
      $handler->handle(); 

      $this->getEm()->remove($task); 
     } catch (Exception $e) { 
      $this->logger->error("{$e->getMessage()}\n{$e->getTraceAsString()}"); 

      $task->setDisabled(true); 
      $this->getEm()->persist($task); 
     } 
    } 
    $this->getEm()->flush(); 

    sleep(1); 
} 

Внутри классов-обработчиков (которые будут извлекаться из демона) будет сделано некоторые отладки работы. Например:

$this->getEm()->transactional(function (EntityManager $em) { 
    $repository = $em->getRepository(UserUnit::class); 
    /** @var UserUnit $entity */ 
    $entity = $repository->findOneBy(['user' => 1, 'type' => Enum::ORC]); 
    $em->lock($entity, LockMode::PESSIMISTIC_WRITE); 
    $entity->increase(1); 
}); 

Так запись orc для игрока 1 будет увеличен на единицу. Представьте, что у нас уже 10 орков. Создание задачи и обработка результатов демона до 11. Все в порядке, но если я установил запись в 0 вручную и создаю задачу без перезапуска демона, ей тоже будет 11. Так что кажется, что демон работает с кешем !? Я прав? Как это решить? Очистка кеша?

ответ

0

Позвонить $this->getEm()->clear(); после $this->getEm()->flush(); решил проблему. После вызова clear объекты будут загружены из базы данных снова, вместо этого будут обслуживаться идентификационной картой Doctrine.

Смежные вопросы