php gearman работник не синхронизирован с доктриной - PullRequest
0 голосов
/ 21 мая 2018

Я наблюдал странное поведение моего объекта доктрины.В моем проекте Symfony я использую ORM с доктриной, чтобы сохранить мои данные в базе данных MySQL.Это работает нормально в большинстве ситуаций.Я также использую gearman в своем проекте, это среда, которая позволяет приложениям выполнять задачи параллельно.У меня есть сервер заданий Gearman , работающий на той же машине, где работает мой Apache, и я зарегистрировал работника GearMan на той же машине в отдельном сеансе 'screen' с использованием экрана * 1004.* оконный менеджер.Благодаря этому методу у меня всегда есть доступ к стандартной консоли из функции, зарегистрированной для gearman-работник.

В вызываемой мной функции gearman-работник у меня есть доступ к объекту доктрины по $doctrine = $this->getContainer()->get('doctrine'), и он работает почти нормально.Но когда я изменил некоторые данные в моей базе данных, доктрина использует все еще старые данные, которые ранее хранились в базе данных.Я полностью сбит с толку, потому что ожидал, что, позвонив:

$repo = $doctrine->getRepository("PackageManagerBundle:myRepo"); $dbElement = $repo->findOneById($Id);

Я всегда получаю текущие записи данных из своей базы данных.Это похоже на странное поведение кеширования, но я понятия не имею, что я сделал неправильно.

Я могу решить эту проблему, зарегистрировав рабочего механизма и выполнив новую функцию:

$worker = new \GearmanWorker(); $worker->addServer(); $worker->addFunction

После этого я возвращаю текущее состояние своей базы данных, пока не изменю что-то еще.Я наблюдаю за этим поведением только в функции рабочего-механика.В остальной части приложения все синхронизируется с моей базой данных и нормально.

1 Ответ

0 голосов
/ 21 мая 2018

Это то, что, я думаю, может происходить.Хотя это может быть неправильно.

Рабочий-механик будет длительным процессом, который подбирает работу для выполнения.Первое полученное задание заставит доктрину загрузить объект в его карту объектов из базы данных.Но для второго задания, которое получает работник, доктрина не будет выполнять поиск в базе данных, вместо этого она проверит свою карту идентификации и обнаружит, что у нее уже есть загруженный объект, и поэтому просто вернет объект из памяти.Если что-то другое, внешнее по отношению к рабочему процессу, изменило запись в базе данных, то у вас получится устаревший объект.

Вы можете указать доктрине, чтобы она удаляла объекты из своей карты идентичности, после чего она выполнит поиск в базе данных.Чтобы принудительно снова загружать объекты из базы данных, а не обслуживать их из карты идентификации, вы должны использовать EntityManager # clear ().

Дополнительная информация здесь: https://www.doctrine -project.org / projects / doctrine-orm / о / 2,6 / ссылки / рабочий с-objects.html # лиц- и самая идентичность карты

...