CDN für .js und .css

Hallo aus der Schweiz

 

Ich habe in der config.php die ‚mediaUrl‘ => ‚https://e4me.cdn-service.ch/‘ drin stehen.

Damit erreiche ich, dass sämtliche Inhallte vom Ordner /media vom cdn service ausgegeben werden.

Wie kann ich erreichen, dass auch Bilder vom Ordner /themes sowie sämtliche .js und .css über CDN laufen?

Grüsse 

Ich habe mir dafür ein kleines Shopware 5.2 Plugin geschrieben. Ohne Gewähr: 

Datei custom/plugins/Cdn/Cdn.php:

 Datei custom/plugins/Cdn/Subscriber/Cdn.php

cdnConfig = $cdnConfig;
    }
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Plugins_ViewRenderer_FilterRender' => 'onFilterRender'
        ];
    }

    /**
     * @param Enlight_Event_EventArgs $args
     *
     * @return string
     */
    public function onFilterRender(Enlight_Event_EventArgs $args)
    {
        $content = $args->getReturn();

        if (false === isset($this->cdnConfig['backend']) || 'local' !== $this->cdnConfig['backend']) {
            return $content;
        }

        if (true === isset($this->cdnConfig['adapters']['local']['replace'])) {
            $keys = array_keys($this->cdnConfig['adapters']['local']['replace']);
            $values = array_values($this->cdnConfig['adapters']['local']['replace']);
            $content = str_replace($keys, $values, $content);
        }
        return $content;
    }
}

Datei custom/plugins/Cdn/Resources/services.xml

            %shopware.cdn%

Datei config.php (replace ggf. erweitern bzw. mit anderen Werten arbeiten)

$cdn = 'https://www.test.com';
$config['cdn'] = [
        'backend' => 'local',
        'adapters' => [
            'local' => [
                'type' => 'local',
                'mediaUrl' => $cdn .'/',
                'path' => realpath( __DIR__. '/'),
                'replace' => [
                    'href="/web/cache/' => 'href="' . $cdn .'/web/cache/',
                    'href="/engine/Shopware/Plugins/' => 'href="' . $cdn .'/engine/Shopware/Plugins/',
                    'src="/web/cache/' => 'src="' . $cdn .'/web/cache/',
                    'src="/engine/Shopware/Plugins/' => 'src="' . $cdn .'/engine/Shopware/Plugins/',
                    'src="/themes/' => 'src="' . $cdn .'/themes/',
                    'srcset="/themes/' => 'srcset="' . $cdn .'/themes/',
                    'content="/themes/' => 'content="' . $cdn .'/themes/'
                ]
            ]
        ]
    ];

 

1 „Gefällt mir“

Cool vielen Dank! :slight_smile:

 

Wozu ist das gut mit CDN?

Kenne ich nämlich noch nicht.

Gruss

Matthias 

 

Statische Elemente auslagern damit diese parallel geladen werden und somit schneller :wink:

Hallo und vielen Dank für den Code.

Ich habe das kleine Plugin aus den Posts zusammengebaut, die config.php (mit meiner CDN-Adresse) angepasst und das Plugin aktiviert.

Allerdings tut das Plugin überhaupt nichts. :wink: Fehlt hier noch etwas? Denn Fehler produziert es schon mal nicht.

Meine schon vorher per CDN gelieferten Bilder kommen weiterhin aus dem CDN, .css und .js, wie z.b. Modernizr werden jedoch lokal und per relativem Pfad abgerufen.

 

Caches (inkl. Themes) gelöscht? Wäre ad hoc das Einzige, was mir einfällt. Es scheint ja so bei mind. zwei Leuten zu funktionieren. 

Danke, aber ja. Das ist inzwischen schon mehrfach geschehen ^^ Hilft leider nichts.

Liegt der Shop ggf. in einem Unterordner? Also z. B. www.domain.de/shop ? Dann muss das replace entsprechend angepasst werden.

Des Weiteren ggf. prüfen, ob der Listener auch greift. Einfach mal ein echo „TEST“ und exit in onFilterRender einbauen, den cache löschen und Seite aufrufen. Es sollte dann nur TEST auf der Seite ausgegeben werden. 

1 „Gefällt mir“

Hallo zurück,

Inzwischen haben wir das Plugin so durchgeprüft.

Das Ergebnis: Der Listener greift nicht. Wir haben es mit einer Testausgabe und anschließendem EXIT probiert, aber aber passiert leider rein garnichts.

Um genau zu sein: echo „test“; exit; direkt nach dem onFilterRender.

Sieht irgend jemand den generellen Fehler im Plugin?

Ich habe noch mal drüber geguckt, statt

Datei custom/plugins/Cdn/Resources/service.xml

müsste es

Datei custom/plugins/Cdn/Resources/services.xml

sein 

Moin!

Ich hab die hier beschriebene Möglichkeit für ein CDN seit längerem in zwei Shops laufen. Nun habe ich bei einem neuen Shop (5.5.4) das Problem, dass zB. beim Kompilieren des Templates folgende Meldung kommt:

"Während der Bearbeitung von Shop “XY” ist ein Fehler aufgetreten: The option “replace” does not exist. Defined options are: “dir”, “file”, “mediaUrl”, “permissions”, “root”, “type”, “url”.

Die config.php sieht aus wie folgt:

 [
	    'host' => 'XXX',
	    'port' => 'XXX',
	    'username' => 'XXX',
	    'password' => 'XXX',
	    'dbname' => 'XXX',
  ],
  'cdn' => [
	  'backend' => 'local',
	  'adapters' => [
		  'local' => [
			  'type' => 'local',
			  'mediaUrl' => $cdn . '/',
			  'path' => realpath( __DIR__. '/'),
			  'replace' => [
				  'href="/web/cache/' => 'href="' . $cdn .'/web/cache/',
				  'href="/engine/Shopware/Plugins/' => 'href="' . $cdn .'/engine/Shopware/Plugins/',
				  'href="/themes/' => 'href="' . $cdn .'/themes/',
				  'src="/media/' => 'src="' . $cdn . '/media/',
				  'src="/web/cache/' => 'src="' . $cdn .'/web/cache/',
				  'src="/engine/Shopware/Plugins/' => 'src="' . $cdn .'/engine/Shopware/Plugins/',
				  'src="/themes/' => 'src="' . $cdn .'/themes/',
				  'srcset="/themes/' => 'srcset="' . $cdn .'/themes/',
				  'content="/themes/' => 'content="' . $cdn .'/themes/'
			  ]
		  ],
	  ],
  ],
);

Kann es sein, dass nur noch bestimmte Keys vorkommen können und replace deshalb nicht mit übernommen wird? Und was kann man tun?

Ich freue mich über Antwort!

Grüße
Thorsten

Habe den letzten Beitrag erst jetzt gesehen und auch nur, da ich nach “The option “replace” does not exist.” gegoogelt habe :D 

Ich habe den ‘replace’ Part jetzt unter einem eigenen Key direkt im Root des config Arrays abgelegt

$config['plugin_cdn'] = [
        'replace' => [
            'href="/web/cache/' => 'href="' . $cdnUrl .'/web/cache/',
            'href="/engine/Shopware/Plugins/' => 'href="' . $cdnUrl .'/engine/Shopware/Plugins/',
            'src="/web/cache/' => 'src="' . $cdnUrl .'/web/cache/',
            'src="/engine/Shopware/Plugins/' => 'src="' . $cdnUrl .'/engine/Shopware/Plugins/',
            'src="/themes/' => 'src="' . $cdnUrl .'/themes/',
            'srcset="/themes/' => 'srcset="' . $cdnUrl .'/themes/',
            'content="/themes/' => 'content="' . $cdnUrl .'/themes/',
        ],
    ];

services.xml dann:

            %shopware.cdn%
            %shopware.plugin_cdn%

Und der Subscriber dann:

cdnSwConfig = $cdnSwConfig;
        $this->cdnPluginConfig = $cdnPluginConfig;
    }
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Plugins_ViewRenderer_FilterRender' => 'onFilterRender'
        ];
    }

    /**
     * @param Enlight_Event_EventArgs $args
     *
     * @return string
     */
    public function onFilterRender(Enlight_Event_EventArgs $args)
    {
        $content = $args->getReturn();

        if (false === isset($this->cdnSwConfig['backend']) || 'local' !== $this->cdnSwConfig['backend']) {
            return $content;
        }

        if (true === isset($this->cdnPluginConfig['replace'])) {
            $keys = array_keys($this->cdnPluginConfig['replace']);
            $values = array_values($this->cdnPluginConfig['replace']);
            $content = str_replace($keys, $values, $content);
        }
        return $content;
    }
}

 

2 „Gefällt mir“

Ich würde das ganze gerne wieder pushen, da ich gerne die Medieninhalte via CDN laden würde. Zurzeit baue ich meinen Shop um, von Magento auf Shopware. Magento kann dies von sich aus, hier leider nicht. Bin dann auf dieses Thema gestoßen und hab eigentlich alles so gemacht wie oben geschrieben, sobald ich die Config aber hochaden zeigt der Shop nur noch das an: HTTP ERROR 500

 [
    'host' => 'xxx.mydbserver.com',
    'port' => 'xxx',
    'username' => 'xxx',
    'password' => 'xxx',
    'dbname' => 'xxx',
	],
	
    'csrfProtection' => [
        'frontend' => false,
        'backend' => true,
    ],
	
	$config['plugin_cdn'] = [
        'replace' => [
            'href="/web/cache/' => 'href="' . $cdnUrl .'/web/cache/',
            'href="/engine/Shopware/Plugins/' => 'href="' . $cdnUrl .'/engine/Shopware/Plugins/',
            'src="/web/cache/' => 'src="' . $cdnUrl .'/web/cache/',
            'src="/engine/Shopware/Plugins/' => 'src="' . $cdnUrl .'/engine/Shopware/Plugins/',
            'src="/themes/' => 'src="' . $cdnUrl .'/themes/',
            'srcset="/themes/' => 'srcset="' . $cdnUrl .'/themes/',
            'content="/themes/' => 'content="' . $cdnUrl .'/themes/',
        ],
    ];

);

Vielleicht einen Tipp woran es liegen könnet? Benutzt wird Shopware 5.5.8, ansonsten hab ich die Datein aktualisiert wie von hhmarco73 geschrieben.

Hallo @Getzoo‍,

hier findest du eine config im Default-Zustand:

https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Configs/Default.php

Da kann man auch schön sehen, wie der Aufbau mal grundsätzlich ist. Ein Plugin (wie weiter oben beschrieben) ist u.U. nicht mehr notwendig.

Vielleicht hilft Dir das schon weiter.

Viele Grüße

P.S. Es dürfte sich um das zweite Semikolon (nach der eckigen Klammer) handeln, das den Fehler verursacht.

1 „Gefällt mir“

Schau dir Mal https://store.shopware.com/en/frosh31872894918f/performance-improvements.html an. Da gibt’s eine Plugin Config für

1 „Gefällt mir“

https://media.domain.de/

Die Domain zeigt auf html/shop/media
wenn ich die Domain aufrufe kommt “error 400 - bad request” somit denke ich, passt das.

Die Config sieht dann wie folgt aus:

 

'cdn' => [
        'backend' => 'local',
        'strategy' => 'md5',
        'liveMigration' => false,
        'adapters' => [
            'local' => [
                'type' => 'local',
                'mediaUrl' => 'https://media.domain.de',
                'permissions' => [
                    'file' => [
                        'public' => 0666 & ~umask(),
                        'private' => 0600 & ~umask(),
                    ],
                    'dir' => [
                        'public' => 0777 & ~umask(),
                        'private' => 0700 & ~umask(),
                    ],
                ],
                'root' => realpath( __DIR__. '/../../../'),
            ],

 

Das Plugin werde ich mir auch anschauen, mir gehts nur darum die Bilder etwas schneller laden zu können, da die Browser nicht so viele Requests pro Domain verarbeiten können und das ganze besser bei PageSpeed Insights darsteht.

Wenn ich nun die obere condig benutze, bekomme ich wieder den HTTP ERROR 500