In Subscriber Product Repository durchsuchen -> 503 Service Unavailable | Dockware

Hallo,

ich habe auf einem Windows 10 Rechner mit sehr eingeschränkten Rechten Dockware aufgesetzt und über die dortige IT auch den entsprechenden Eintrag in der Windows docker-users eintragen lassen.

Shopware läuft, ich kann im Admin Produkte anlegen und bekomme auch das Frontend normal angezeigt. Jetzt habe ich das erste kleine Plugin getestet mit einem Subscriber auf das PRODUCT_LOADED_EVENT und übergebe das product.repository als Service.

Wenn ich jetzt das Repository (besteht zu Testzwecken aus 6 Produkten) durchsuchen möchte und eine Seite mit Produkten aufrufe, tut sich 20 Sekunden nicht und dann bekomme ich ein 503 Service Unavailable. Kann dies ein Rechte-Problem sein, das ich irgendwo übersehen habe oder habt ihr einen Tipp, woran das liegen könnte?

Lg Alex

503 hört sich an, dass im Backend etwas schief läuft, was sich eigentlich im error_log wiedergeben sollte.

Könnte auch ein Memory Limit Problem sein… Rechte, glaube ich eher nicht. Dann würde gar nichts tun.

Würde tendenziell im PHP Code nach dem Fehler suchen.

Codemäßig wird es passen, da das Plugin wirklich nichts anderes macht als ein Repo zu bekommen und das zu durchsuchen ohne spezielles Criteria. Klappt so sonst immer problemlos.

Memory Limit klingt tatsächlich plausibel. Die Maschine hier ist leider rechtlich echt eingeschränkt, vermutlich hat der Prozess zu wenig Speicher.

Bekomme es einfach nicht hin. Komischerweise kann ich alle anderen Repos durchsuchen mit Ausnahme von product.repository oder sales_channel.product.repository. Habe nur die Default Produkte von SW drinnen.

Naja, ohne die genaue Fehlermeldung des Servers, ist es ja nur ein Ratespiel…

Ich hab das ganze lokal in einem Dockercontainer laufen. In den Shopware Logs stehen keine Fehler, nur eine Unmenge an Depricated Hinweisen. Ich bin noch relativ grün hinter den Ohren wenn es um Docker geht. Wo finde ich denn die Error Logs?

Lg

Scheinbar mache ich etwas beim Durchsuchen des Repos falsch. Habe es jetzt auf meinem privaten Rechner mit einem frischen Dockerimage probiert → gleiches Ergebnis.

Dann habe ich es auf einer meiner laufenden Dev Umgebungen für ein anderes Projekt proviert → gleiches Ergebnis.

/Resources/service.xml

<service id="ExtendedProducts\Subscriber\MagazineData">
    <argument type="service" id="product.repository"/>
    <tag name="kernel.event_subscriber"/>
</service>

/Subscriber/MagazineData.php

<?php declare(strict_types=1);

namespace ExtendedProducts\Subscriber;

use Shopware\Core\Content\Product\ProductEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;

class MagazineData implements EventSubscriberInterface
{
    /**
     * @var EntityRepositoryInterface 
     */
    private $productRepository;

    public function __construct(EntityRepositoryInterface $productRepository) 
    {
        $this->productRepository = $productRepository;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            ProductEvents::PRODUCT_LOADED_EVENT => 'onProductsLoaded'
        ];
    }

    public function onProductsLoaded(EntityLoadedEvent $event)
    {
        $products = $this->productRepository
            ->search(
                new Criteria(), 
                $event->getContext()
            );
    }
}

Und auf diversen Instanzen führt das zu einem 503 Error nach etwa 15 Sekunden Ladezeit.

Mache ich irgendwas falsch?

LG Alex

Ich nehme mal an, das Criteria ist in deiner Abfrage ist nicht leer. Das Problem ist, dass du ein Produkt lädst und das triggert ja wieder dein Event, welches dann wieder ein Produkt lädt und auch wieder das Event usw. Ich vermute du bist also in einer Endlos-Schleife und deshalb wird der Server-Error wahrscheinlich ein Timeout sein.

Wenn du in der Storefront, beim Aufruf eine Artikelseite etwas machen möchtest, nimm am besten das Event ProductPageLoadedEvent.

Das klingt einleuchtend. Ich habe CustomFields auf bestimmten Produkten, in denen ich passende Zubehörprodukte angeben kann. In der Product Card möchte ich dann die Miniaturvorschau der passenden Produkte laden.

Ein ProductCardLoadedEvent oÄ habe ich nicht gefunden, deshalb habe ich den ProductLoadedEvent genommen, aber deine Erklärung macht natürlich total Sinn. Hättest du einen Vorschlag für eine alternative Lösung?

Lg Alex

Was meinst du mit Product Card? Ich verstehe nicht an welcher Stelle du die Zubehör-Artikel ausgeben willst.

Im Listing innerhalb der Produktkachel des jeweiligen Produktes.

Dann nimm lieber ProductEvents::PRODUCT_LISTING_RESULT

Danke dir, du hast mir echt geholfen!