Media Optimizer Installiert aber läuft nicht

Hallo Freunde,

über die Console sind 3 runnables installiert wurden:

$ bin/console sw:media:optimize --info
±----------±---------±----------------------+
| Optimizer | Runnable | Supported mime-types  |
±----------±---------±----------------------+
| jpegoptim | Yes      | image/jpeg, image/jpg |
| pngout    | No       | image/png             |
| jpegtran  | No       | image/jpeg, image/jpg |
| optipng   | Yes      | image/png             |
| pngcrush  | No       | image/png             |
| guetzli   | Yes      | image/jpeg, image/jpg |
±----------±---------±----------------------+

 

Jedoch läuft keins davon. Wenn ich im Backend auf System -> Media Optimizer gehe sind alle mit dem roten x versehen.

 

Ich weiß leider absolut nicht wo der Fehler liegt. Kann jemand helfen?

Hallo Zusammen,

ich habe das gleiche Problem und die dev.guides liefern auch irgendwie keinen Hinweis:

https://developers.shopware.com/developers-guide/media-optimizer/#display-available-optimizer

Irgendeine Lösung oder ist die Anzeige (rotes x) einfach nur fehlerhaft ?

Grüße Thomas

Hey,

die Anzeige ist nicht fehlerhaft.

Bei dir sind bloß die PHP Einstellungen für cli und PHP-FPM/CGI/Apache-Module anders, so dass im Webaufruf es nicht möglich ist zu optimieren.

D.h du kannst manuell in der Console optimieren, aber bei neuen Bildern die im Media Manager hochgeladen werden, werden diese nicht automatisch optimiert.

Das einfachste bei solchen Problem ist beim Hoster zu melden und den Enviroment variable PATH zu prüfen

Hey, 

@Shyim‍ auf welchen PATH prüft der Shopware Core für den Webaufruf? 

Gruß Philipp 

Hallo,

bei unserem Hoster ist das die Einstellung open_basedir, da müßte eben ein entsprechender Pfad rein, wie z.B. /usr/bin rein,

wäre aber wiederum schlechter für die Sicherheit des Shops.

Warum es dafür keine andere Lösung gibt, verstehe ich allerdings nicht ganz.

In der Systemumgebungsvariable PATH muss der Optimierer drin sein.

@WernerBu‍

PHP kann selbst keine Bilder optimieren. Deshalb werden hier externe Programe verwendet um das zutun. Natürlich wäre der optimale Weg einen eigenen bin Ordner für die Optimizer zu erstellen und nur diesen Ordner einzufügen. Aber hoffen wir mal, dass es mit PHP 7.4 alles besser wird dank PHP: rfc:ffi

Eben, das verstehe ich eben nicht, warum das die Hoster nicht anbieten mit dem eigenen bin-Ordner.

Wer will schon jedesmal das Teil in der Konsole aufrufen, zeimlich blöd.

hmmm:

habe mit printenv mal die umgebungsvariablen angezeigt, Ergebnis: 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

die optimierer sind im Verzeichnis /usr/bin auch enthalten

was ist hier falsch ?

PS: eigener Root Server mit Plesk 

LG Thomas

Hallo,

was ist der Wert der oben genannten open_basedir-Einstellung im Plesk bei den PHP-Einstellungen?

Im Pfad ist /usr/bin bei uns auch, wird aber eben nicht erlaubt durch die open_basedir-Einstellung.

Das ist ja gerade für uns die Problematik, Sicherheitseinschränkungen in Kauf nehmen oder nicht?

Viele Grüße,

Werner.

ohh man sch…

Hallo zusammen

also, wenn ich in Plesk die open_basedir Standard-Einstellung für die betreffende Domain wie folgt nur um einzelne Dateien  erweitere (bei mir die jpegtran und die optipng), gehts:

{WEBSPACEROOT}{/}{:}{TMP}{/}:/usr/bin/jpegtran:/usr/bin/optipng

und die Sicherheit bleibt auch erhalten, denke ich mal

Ich vermute auch mal, dass eine Änderung der globalen PHP.INI von der Plesk Einstellung überschrieben wird, sofern da etwas drin steht wie im standard? Kann das jemand bestätigen  ?

Grüße Thomas

 

Hallo,

eh, super, habe ich gar nicht ausprobiert, hatte das nur mit /usr/bin ausprobiert,

läßt mich jetzt blöd dastehen:-)

Allerdings hat mir der Support von Aixpro das so erklärt und ich habe das ohne zu prüfen

so weitergegeben, schön blöd, sorry für die Verwirrung, noch nen schönes Wochenende.

Viele Grüße,

Werner.

Ich fasse es mal zusammen:

  • die Optimierer werden in der Regel im Verzeichnis: /usr/bin/ von Linux installiert. (bei mir Ubuntu)

  • dieser Pfad ist in der Regel auch in der Path Variable enthalten.

  • Der Shop, ist in einem Web Verzeichnis installiert und läuft mit PHP (bei mir PHP7.2)

  • PHP kann/soll i m Normalfall keine Dateien/Programme ausserhalb des jeweiligen WEB/Domainverzeichnisses aufrufen. (Sicherheit), da nützt auch die Path Variable nichts!

  • Hier kann mit der PHP.INI Variable "open_basedir = " Abhilfe geschaffen werden (Mein AHhhhA Erlebnis)

  • "open_basedir = " kann auf für ganzes Verzeichnis oder aber auch nur für einzelne Dateien verwendet werden.

  • "open_basedir = " ist eine Variable in der PHP.INI

  • bei Verwendung von Plesk oder Ähnlichem kann „open_basedir = /xxx/yyy“ in den Einstellungen von z.B. PLESK gesetzt werden.

  • ein Doppelpunkt trennt die einzelnen Einträge

  • Beispiel:

  • open_basedir = /usr/bin 
    Alle Dateien in diesem Verzeichnis können aufgerufen werden. (Problem bei der Sicherheit, da hier ggf. viele andere User Progs mit drin sind)

  • open_basedir = /usr/bin/jpegtran:/usr/bin/optipng 
    nur für die beiden einzelnen Dateien optipng und jpegtran zugelassen (Sicherheit gewährleistet)

Beispiel Plesk PHP Einstellung zu einer Domain:
{WEBSPACEROOT}{/}{:}{TMP}{/}:/usr/bin/jpegtran:/usr/bin/optipng
Ich habe die vorhandene Standard Einstellung um die beiden Optimierer erweitert

Ich hoffe das passt so auch für nicht „EXPERTEN“

Grüße Thomas

2 Likes

hmmm merkwürdig geht bei mir trozdem nicht ;(

  • sind denn die Optimierer hier z.B. jpegtran und optipng auch im Linux Betriebssystem installiert worden, und wenn ja in welchem Verzeichnis liegen sie genau?

  • sind Benutzerrechte auf diese Dateien gegeben, sodass der “shopware user” darauf zugreifen kann? gegebene Rechte auf Dateien im shopware verzeichnis mal mit denen der Optimierer files vergleichen. (ownerID, groupID) Oder auch andersherum ist der WebUser des Shops in einer Usergruppe mit entsprechenden Rechten ?

 

1 Like

Hallo, ich habe derzeit das selbe Verhalten mit meinem Shopware Version: 5.5.10.

Grundsätzlich funktioniert die Bildoptimierung über die Shopware-Console ohne Einschränkungen.

Im Backend unter den Systeminfos wird mir allerdings angezeigt, dass die Binaries für bspw. optipng/jpegoptim nicht ausführbar sind.

Die Lösung über das open_basedir ist zwar funktional, aber meiner Ansicht nach nicht „Best Patrice“, da manche Hoster das setzen des open_basedir aus Securitygründen nicht zulassen.

Dementsprechend habe ich mir den Quellcode des Media Optimizers angeschaut.

Ausschlaggebend für dieses Verhalten ist die Funktion: isRunnable() in der Datei: engine/Shopware/Bundle/MediaBundle/Optimizer/BinaryOptimizer.php

Hier wird folgendes für die Binary gesetzt:

$bin = $finder->find($this->getCommand(), $this->getCommand());

Aufruf des Media Opimizer per console: $bin = " /usr/local/bin/jpegoptim"

Aufruf des Media Opimizer per Systeminfo: $bin = " jpegoptim"

Im Anschluss wird dann folgendes überprüft:

$this->isRunnable = !empty($bin) && is_executable($bin);

is_executable liefert hier in meinem Fall über die Systeminfo immer FALSE zurück, weil die PHP-Funktion die PATH Umgebungsvariable nicht berücksichtigt.

Weitere Infos: PHP: is_executable - Manual

Meiner Ansicht nach müsste die Methode: isRunnable() wie folgt erweitert werden.

 

   /**
     * {@inheritdoc}
     */
    public function isRunnable()
    {
        if ($this->isRunnable !== null) {
            return $this->isRunnable;
        }

        $finder = new ExecutableFinder();
        $bin = $finder->find($this->getCommand(), $this->getCommand());

        $serverPaths = explode(PATH_SEPARATOR, getenv("PATH"));
        $localPaths = explode(PATH_SEPARATOR, getenv("PATH", "local_only"));
        $paths = array_merge($serverPaths, $localPaths);
        foreach ($paths as $path) {
            if (!empty($bin) && is_executable($path . DIRECTORY_SEPARATOR . $bin ) || !empty($bin) && is_executable($bin)) {
                $this->isRunnable = true;
            }
        }

        return $this->isRunnable;
    }

 

Bei mir löst Open Base Dir das Problem leider nicht. Consolte sagt Yes Backend No …

Problem nach Server neustart gelöst …da war irgendwo der Wurm drin.

@Kneggebrot schrieb:

Hallo, ich habe derzeit das selbe Verhalten mit meinem Shopware Version: 5.5.10.

Grundsätzlich funktioniert die Bildoptimierung über die Shopware-Console ohne Einschränkungen.

Im Backend unter den Systeminfos wird mir allerdings angezeigt, dass die Binaries für bspw. optipng/jpegoptim nicht ausführbar sind.

Die Lösung über das open_basedir ist zwar funktional, aber meiner Ansicht nach nicht “Best Patrice”, da manche Hoster das setzen des open_basedir aus Securitygründen nicht zulassen.

Dementsprechend habe ich mir den Quellcode des Media Optimizers angeschaut.

Ausschlaggebend für dieses Verhalten ist die Funktion: isRunnable() in der Datei: engine/Shopware/Bundle/MediaBundle/Optimizer/BinaryOptimizer.php

Hier wird folgendes für die Binary gesetzt:

$bin = $finder->find($this->getCommand(), $this->getCommand());

Aufruf des Media Opimizer per console: $bin = " /usr/local/bin/jpegoptim"

Aufruf des Media Opimizer per Systeminfo: $bin = " jpegoptim"

Im Anschluss wird dann folgendes überprüft:

$this->isRunnable = !empty($bin) && is_executable($bin);

is_executable liefert hier in meinem Fall über die Systeminfo immer FALSE zurück, weil die PHP-Funktion die PATH Umgebungsvariable nicht berücksichtigt.

Weitere Infos: https://www.php.net/manual/de/function.is-executable.php#123883

Meiner Ansicht nach müsste die Methode: isRunnable() wie folgt erweitert werden.

 

/**

  • {@inheritdoc}
    */
    public function isRunnable()
    {
    if ($this->isRunnable !== null) {
    return $this->isRunnable;
    }

$finder = new ExecutableFinder();
$bin = $finder->find($this->getCommand(), $this->getCommand());

$serverPaths = explode(PATH_SEPARATOR, getenv(“PATH”));
$localPaths = explode(PATH_SEPARATOR, getenv(“PATH”, “local_only”));
$paths = array_merge($serverPaths, $localPaths);
foreach ($paths as $path) {
if (!empty($bin) && is_executable($path . DIRECTORY_SEPARATOR . $bin ) || !empty($bin) && is_executable($bin)) {
$this->isRunnable = true;
}
}

return $this->isRunnable;
}

Das ist so nicht ganz richtig, da das Probem von Symfony abgefangen wird: https://github.com/symfony/process/blob/master/ExecutableFinder.php#L64

Also wer das Problem hat:

a) Open_basedir ist gesetzt und falsch --> korrigieren. Muss auch für die Verzeichnisse der Optimizer gelten.
b) Open_basedir ist deaktiviert --> kontrollieren ob die “PATH” Umgebungsvariable in PHP korrekt definiert ist. Wenn diese korrekt definiert wird, wird der Pfad automatisch vor den Namen des Optimizers angefügt und is_executable geht also durch. Die Kontrolle kann in PHP über getenv(“PATH”); erfolgen.

Ich habe dasselbe Problem. Ich habe alle Optimizers installiert: guetzli und pngout in /usr/local/bin (aber habe auch in /bin probiert) und andere per “apt install…”. Auch nach Server-Reboot steht der rote “X” bei allen Optimizers in Systeminfo. Ich habe PATH bei allen relevanten Nutzern geprüft: root, my_php_user, nginx. Überall sind zumindest guetzli und pngout leicht findbar. 

Dabei:

bin/console sw:media:optimize --info
+-----------+----------+-----------------------+
| Optimizer | Runnable | Supported mime-types |
+-----------+----------+-----------------------+
| jpegoptim | Yes | image/jpeg, image/jpg |
| pngout | Yes | image/png |
| jpegtran | Yes | image/jpeg, image/jpg |
| optipng | Yes | image/png |
| pngcrush | Yes | image/png |
| guetzli | Yes | image/jpeg, image/jpg |
+-----------+----------+-----------------------+

Was könnte ich noch machen? Die open_basedir würde ich lieber nicht verwenden.

 

Mit freundlichen Grüßen
Roman

open_basedir macht dein Shop bloß nur langsamer. Benutz wenn du kannst chroot und stell dann sicher das in dem chroot das verfügbar ist