Symfony Messenger с отношением ManyToMany, Разрешенная память UnitOfWork - PullRequest
0 голосов
/ 02 апреля 2020

Я столкнулся с проблемой памяти. Я создал обработчик для моих очередей. И после того, как в консоли было выполнено 309 сообщений, я столкнулся с Allowed memory size. Я использовал для очереди Symfony Messenger. В обработчике я создаю один объект Product с несколькими объектами реализаций Brand, Shop и Categories, в котором сохраняются объекты ManyToMany и ManyToOne с каскадным сохранением. Без создания отношений сущностей все работает, 2037 год был создан, без исключений. Может быть, какая-то проблема с моим отношением. Потому что, когда я удаляю в addShopRelation и addCategoryRelation functins addProduct для каждой сущности, потребитель выполнил все сообщения из очереди без ошибок. Но в таблицах category_product и shop_product ничего не создано. Как это может работать corerct, созданный объект с отношением ManyToMany в одном сообщении из очереди?

Product Entity

class Product implements EntityValidatorException
{
use TimestampableEntity;

/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 * @Annotation\Groups({Product::SERIALIZED_GROUP_LIST})
 */
private $id;


/**
 * @var Collection|Category[]
 * @ORM\ManyToMany(targetEntity="Category", mappedBy="products", cascade={"persist"})
 * @Annotation\Groups({Product::SERIALIZED_GROUP_LIST})
 */
private $categoryRelation;

/**
 * @var Brand
 *
 * @ORM\ManyToOne(targetEntity="Brand", inversedBy="products", cascade={"persist"})
 * @Annotation\Groups({Product::SERIALIZED_GROUP_LIST})
 */
private $brandRelation;

/**
 * @var Collection|Shop[]
 * @ORM\ManyToMany(targetEntity="Shop", mappedBy="products", cascade={"persist"})
 * @Annotation\Groups({Product::SERIALIZED_GROUP_LIST})
 */
private $shopRelation;

public function addShopRelation(Shop $shopRelation): self
{
    if (!$this->getShopRelation()->contains($shopRelation)) {
        $this->shopRelation[] = $shopRelation;
        $shopRelation->addProduct($this);
    }

    return $this;
}

public function addCategoryRelation(Category $categoryRelation): self
{
    if (!$this->getCategoryRelation()->contains($categoryRelation)) {
        $this->categoryRelation[] = $categoryRelation;
        $categoryRelation->addProduct($this);
    }

    return $this;
}

public function setBrandRelation(?Brand $brandRelation): self
{
    $this->brandRelation = $brandRelation;

    return $this;
}

и в моем обработчике после создания сущности Product я создаю сущности отношений и

Я использую

        "name": "symfony/orm-pack",
        "version": "v1.0.8",

и

        "name": "symfony/framework-bundle",
        "version": "v5.0.5",

мой messenger.yaml, я использовал все промежуточное ПО для doctrine, ping, закрытие соединения и одну транзакцию, может быть, что-то будет для менеджера сущностей из сущностей, как em->clear()? Но если я исправлю исследование, подписчик на событие doctrine.orm.messenger.event_subscriber.doctrine_clear_entity_manager. Этот подписчик регистрируется автоматически, поэтому вам не нужно ничего добавлять. Но ..

messenger:
  serializer:
    default_serializer: messenger.transport.symfony_serializer
    symfony_serializer:
      format: json
      context: { }
  buses:
    messenger.bus.default:
      middleware:
        - doctrine_ping_connection
        - doctrine_close_connection
        - doctrine_transaction
        # my custom middleware without some logic, just for test 
        - reply_middleware

  failure_transport: failed

  transports:
    success:
      dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
      options:
        exchange:
          type: direct
          name: productrow
          default_publish_routing_key: normal
        queues:
          messages_normal:
            binding_keys: [normal]
    andraction_parse_row_success:
      dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
      options:
        exchange:
          type: direct
          name: andraction_parse_row
          default_publish_routing_key: parse_row
        queues:
          andraction_parse_row:
            binding_keys: [parse_row]
    failed: 'doctrine://default?queue_name=failed'

  routing:
      'App\QueueModel\FileReadyDownloaded': success
      'App\QueueModel\AdtractionDataRow': andraction_parse_row_success

трассировка стека

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes) in /var/www/symfony/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php on line 128
PHP Stack trace:
PHP   1. {main}() /var/www/symfony/bin/console:0
PHP   2. Symfony\Bundle\FrameworkBundle\Console\Application->run() /var/www/symfony/bin/console:42
PHP   3. Symfony\Bundle\FrameworkBundle\Console\Application->doRun() /var/www/symfony/vendor/symfony/console/Application.php:140
PHP   4. Symfony\Bundle\FrameworkBundle\Console\Application->doRun() /var/www/symfony/vendor/symfony/framework-bundle/Console/Application.php:83
PHP   5. Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() /var/www/symfony/vendor/symfony/console/Application.php:264
PHP   6. Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() /var/www/symfony/vendor/symfony/framework-bundle/Console/Application.php:97
PHP   7. Symfony\Component\Messenger\Command\ConsumeMessagesCommand->run() /var/www/symfony/vendor/symfony/console/Application.php:930
PHP   8. Symfony\Component\Messenger\Command\ConsumeMessagesCommand->execute() /var/www/symfony/vendor/symfony/console/Command/Command.php:255
PHP   9. Symfony\Component\Messenger\Worker->run() /var/www/symfony/vendor/symfony/messenger/Command/ConsumeMessagesCommand.php:186
PHP  10. Symfony\Component\Messenger\Worker->handleMessage() /var/www/symfony/vendor/symfony/messenger/Worker.php:81
PHP  11. Symfony\Component\Messenger\RoutableMessageBus->dispatch() /var/www/symfony/vendor/symfony/messenger/Worker.php:117
PHP  12. Symfony\Component\Messenger\TraceableMessageBus->dispatch() /var/www/symfony/vendor/symfony/messenger/RoutableMessageBus.php:54
PHP  13. Symfony\Component\Messenger\MessageBus->dispatch() /var/www/symfony/vendor/symfony/messenger/TraceableMessageBus.php:41
PHP  14. Symfony\Component\Messenger\Middleware\TraceableMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/MessageBus.php:80
PHP  15. Symfony\Component\Messenger\Middleware\AddBusNameStampMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/TraceableMiddleware.php:43
PHP  16. Symfony\Component\Messenger\Middleware\RejectRedeliveredMessageMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/AddBusNameStampMiddleware.php:37
PHP  17. Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/RejectRedeliveredMessageMiddleware.php:42
PHP  18. Symfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/DispatchAfterCurrentBusMiddleware.php:67
PHP  19. Symfony\Bridge\Doctrine\Messenger\DoctrinePingConnectionMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/FailedMessageProcessingMiddleware.php:34
PHP  20. Symfony\Bridge\Doctrine\Messenger\DoctrinePingConnectionMiddleware->handleForManager() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/AbstractDoctrineMiddleware.php:45
PHP  21. Symfony\Bridge\Doctrine\Messenger\DoctrineCloseConnectionMiddleware->handle() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/DoctrinePingConnectionMiddleware.php:32
PHP  22. Symfony\Bridge\Doctrine\Messenger\DoctrineCloseConnectionMiddleware->handleForManager() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/AbstractDoctrineMiddleware.php:45
PHP  23. Symfony\Bridge\Doctrine\Messenger\DoctrineTransactionMiddleware->handle() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/DoctrineCloseConnectionMiddleware.php:31
PHP  24. Symfony\Bridge\Doctrine\Messenger\DoctrineTransactionMiddleware->handleForManager() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/AbstractDoctrineMiddleware.php:45
PHP  25. App\Middleware\ReplyMiddleware->handle() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/DoctrineTransactionMiddleware.php:31
PHP  26. Symfony\Component\Messenger\Middleware\SendMessageMiddleware->handle() /var/www/symfony/src/Middleware/ReplyMiddleware.php:17
PHP  27. Symfony\Component\Messenger\Middleware\HandleMessageMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/SendMessageMiddleware.php:79
PHP  28. App\QueueModelHandlers\AdtractionDataRowHandler->__invoke() /var/www/symfony/vendor/symfony/messenger/Middleware/HandleMessageMiddleware.php:63
PHP  29. ContainerJvWF4xj\ShopService_7b646fc->createShopFromProduct() /var/www/symfony/src/QueueModelHandlers/AdtractionDataRowHandler.php:77
PHP  30. App\Services\Models\ShopService->createShopFromProduct() /var/www/symfony/var/cache/dev/ContainerJvWF4xj/App_KernelDevDebugContainer.php:9101
PHP  31. App\Entity\Product->addShopRelation() /var/www/symfony/src/Services/Models/ShopService.php:43
PHP  32. App\Entity\Shop->addProduct() /var/www/symfony/src/Entity/Product.php:680
PHP  33. Doctrine\ORM\PersistentCollection->contains() /var/www/symfony/src/Entity/Shop.php:85
PHP  34. Doctrine\ORM\PersistentCollection->contains() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/PersistentCollection.php:414
PHP  35. Doctrine\ORM\PersistentCollection->initialize() /var/www/symfony/vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php:61
PHP  36. Doctrine\ORM\PersistentCollection->doInitialize() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/PersistentCollection.php:213
PHP  37. Doctrine\ORM\UnitOfWork->loadCollection() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/PersistentCollection.php:694
PHP  38. Doctrine\ORM\Persisters\Entity\BasicEntityPersister->loadManyToManyCollection() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:2936
PHP  39. Doctrine\ORM\Persisters\Entity\BasicEntityPersister->loadCollectionFromStatement() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:962
PHP  40. Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateAll() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:952
PHP  41. Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateAllData() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:153
PHP  42. Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateRowData() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php:162
PHP  43. Doctrine\ORM\Internal\Hydration\ObjectHydrator->getEntity() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php:492
PHP  44. Doctrine\ORM\UnitOfWork->createEntity() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php:271
PHP  45. Doctrine\ORM\Proxy\ProxyFactory->getProxy() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:2806
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 32768 bytes) in /var/www/symfony/vendor/symfony/error-handler/Error/OutOfMemoryError.php on line 1
PHP Stack trace:
PHP   1. {main}() /var/www/symfony/bin/console:0
PHP   2. Symfony\Bundle\FrameworkBundle\Console\Application->run() /var/www/symfony/bin/console:42
PHP   3. Symfony\Bundle\FrameworkBundle\Console\Application->doRun() /var/www/symfony/vendor/symfony/console/Application.php:140
PHP   4. Symfony\Bundle\FrameworkBundle\Console\Application->doRun() /var/www/symfony/vendor/symfony/framework-bundle/Console/Application.php:83
PHP   5. Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() /var/www/symfony/vendor/symfony/console/Application.php:264
PHP   6. Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() /var/www/symfony/vendor/symfony/framework-bundle/Console/Application.php:97
PHP   7. Symfony\Component\Messenger\Command\ConsumeMessagesCommand->run() /var/www/symfony/vendor/symfony/console/Application.php:930
PHP   8. Symfony\Component\Messenger\Command\ConsumeMessagesCommand->execute() /var/www/symfony/vendor/symfony/console/Command/Command.php:255
PHP   9. Symfony\Component\Messenger\Worker->run() /var/www/symfony/vendor/symfony/messenger/Command/ConsumeMessagesCommand.php:186
PHP  10. Symfony\Component\Messenger\Worker->handleMessage() /var/www/symfony/vendor/symfony/messenger/Worker.php:81
PHP  11. Symfony\Component\Messenger\RoutableMessageBus->dispatch() /var/www/symfony/vendor/symfony/messenger/Worker.php:117
PHP  12. Symfony\Component\Messenger\TraceableMessageBus->dispatch() /var/www/symfony/vendor/symfony/messenger/RoutableMessageBus.php:54
PHP  13. Symfony\Component\Messenger\MessageBus->dispatch() /var/www/symfony/vendor/symfony/messenger/TraceableMessageBus.php:41
PHP  14. Symfony\Component\Messenger\Middleware\TraceableMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/MessageBus.php:80
PHP  15. Symfony\Component\Messenger\Middleware\AddBusNameStampMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/TraceableMiddleware.php:43
PHP  16. Symfony\Component\Messenger\Middleware\RejectRedeliveredMessageMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/AddBusNameStampMiddleware.php:37
PHP  17. Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/RejectRedeliveredMessageMiddleware.php:42
PHP  18. Symfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/DispatchAfterCurrentBusMiddleware.php:67
PHP  19. Symfony\Bridge\Doctrine\Messenger\DoctrinePingConnectionMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/FailedMessageProcessingMiddleware.php:34
PHP  20. Symfony\Bridge\Doctrine\Messenger\DoctrinePingConnectionMiddleware->handleForManager() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/AbstractDoctrineMiddleware.php:45
PHP  21. Symfony\Bridge\Doctrine\Messenger\DoctrineCloseConnectionMiddleware->handle() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/DoctrinePingConnectionMiddleware.php:32
PHP  22. Symfony\Bridge\Doctrine\Messenger\DoctrineCloseConnectionMiddleware->handleForManager() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/AbstractDoctrineMiddleware.php:45
PHP  23. Symfony\Bridge\Doctrine\Messenger\DoctrineTransactionMiddleware->handle() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/DoctrineCloseConnectionMiddleware.php:31
PHP  24. Symfony\Bridge\Doctrine\Messenger\DoctrineTransactionMiddleware->handleForManager() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/AbstractDoctrineMiddleware.php:45
PHP  25. App\Middleware\ReplyMiddleware->handle() /var/www/symfony/vendor/symfony/doctrine-bridge/Messenger/DoctrineTransactionMiddleware.php:31
PHP  26. Symfony\Component\Messenger\Middleware\SendMessageMiddleware->handle() /var/www/symfony/src/Middleware/ReplyMiddleware.php:17
PHP  27. Symfony\Component\Messenger\Middleware\HandleMessageMiddleware->handle() /var/www/symfony/vendor/symfony/messenger/Middleware/SendMessageMiddleware.php:79
PHP  28. App\QueueModelHandlers\AdtractionDataRowHandler->__invoke() /var/www/symfony/vendor/symfony/messenger/Middleware/HandleMessageMiddleware.php:63
PHP  29. ContainerJvWF4xj\ShopService_7b646fc->createShopFromProduct() /var/www/symfony/src/QueueModelHandlers/AdtractionDataRowHandler.php:77
PHP  30. App\Services\Models\ShopService->createShopFromProduct() /var/www/symfony/var/cache/dev/ContainerJvWF4xj/App_KernelDevDebugContainer.php:9101
PHP  31. App\Entity\Product->addShopRelation() /var/www/symfony/src/Services/Models/ShopService.php:43
PHP  32. App\Entity\Shop->addProduct() /var/www/symfony/src/Entity/Product.php:680
PHP  33. Doctrine\ORM\PersistentCollection->contains() /var/www/symfony/src/Entity/Shop.php:85
PHP  34. Doctrine\ORM\PersistentCollection->contains() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/PersistentCollection.php:414
PHP  35. Doctrine\ORM\PersistentCollection->initialize() /var/www/symfony/vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php:61
PHP  36. Doctrine\ORM\PersistentCollection->doInitialize() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/PersistentCollection.php:213
PHP  37. Doctrine\ORM\UnitOfWork->loadCollection() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/PersistentCollection.php:694
PHP  38. Doctrine\ORM\Persisters\Entity\BasicEntityPersister->loadManyToManyCollection() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:2936
PHP  39. Doctrine\ORM\Persisters\Entity\BasicEntityPersister->loadCollectionFromStatement() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:962
PHP  40. Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateAll() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:952
PHP  41. Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateAllData() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:153
PHP  42. Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateRowData() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php:162
PHP  43. Doctrine\ORM\Internal\Hydration\ObjectHydrator->getEntity() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php:492
PHP  44. Doctrine\ORM\UnitOfWork->createEntity() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php:271
PHP  45. Doctrine\ORM\Proxy\ProxyFactory->getProxy() /var/www/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:2806
PHP  46. Symfony\Component\ErrorHandler\ErrorHandler::handleFatalError() /var/www/symfony/vendor/symfony/error-handler/ErrorHandler.php:0
PHP  47. spl_autoload_call() /var/www/symfony/vendor/symfony/error-handler/ErrorHandler.php:676
PHP  48. Symfony\Component\ErrorHandler\DebugClassLoader->loadClass() /var/www/symfony/vendor/symfony/error-handler/ErrorHandler.php:676
/var/www/symfony # 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...