Gibt es eine schnelle Möglichkeit Medienfiles anzulegen? Aktuell dauert eine Datei mit ca 80 kb in etwa 5 Sekunden. Da der Shop mehrere tausend Artikel hat, dauert das sehr lange.
Habt Ihr einen Tip für uns?
Gibt es eine schnelle Möglichkeit Medienfiles anzulegen? Aktuell dauert eine Datei mit ca 80 kb in etwa 5 Sekunden. Da der Shop mehrere tausend Artikel hat, dauert das sehr lange.
Habt Ihr einen Tip für uns?
Wie soll man ohne Details zum Prozess, Tipps zur Optimierung geben?
Ich mache es generell immer so, dass ich Daten (MySql, Bilder usw.) im ersten Schritt auf den Server laden lasse. Dann spare ich mir den Umweg über HTTP bei den api-calls sondern kann direkt über die Shopwares Services & Repos die dann schon auf dem Server liegenden Daten ins System laden.
Wie soll man ohne Details zum Prozess, Tipps zur Optimierung geben?
Die Dateien liegen in einem Verzeichnis auf dem Server und haben per Dateiname eine Zuordnung zur Artikelnummer.
Artikel1_Bild1.jpg, Artikel1_Bild2.jpg …
Angestoßen wird das ganze von einer Software die die Bilddaten hochlädt und dann den Import ins Shopware6 anstößt. Nur dauert der Import in diesem Fall sehr lange, pro Artikel ca 5 Sekunden, da ja auch geschaut werden muss ob gewisse Bilder bereits vorhanden sind und dann ggf. vorher gelöscht werden müssen.
Bei einer Menge von 300.000 Artikeln sind 5 Sek./Bild schon sehr lange, zudem einige Artikel 4-5 Bilder haben und das ganze ca. 70 Tage dauern würde
Macht ihr das über die API?
Macht ihr das über die API?
Ja, gibt es einen besseren Weg diese Menge an Daten ins Shopware zu bekommen?
Naja, wenn die Dateien eh schon auf dem selben Server liegen, braucht der Server sie ja nicht nochmal per HTTP Request an sich selber schicken.
Der Client (vermutlich das Importscript auf deinem Server) sendet den Api-Request raus, der wird aufgelöst/verteilt und an den Server geschickt. Der verarbeitet die Anfrage und schickt dann eine Antwort zurück. Dieses hin und her dauert natürlich und sollte man sich wenn möglich sparen.
Mach ein Shopware Plugin und nutze die Shopware Services und Repos, um die Daten zu importieren. Ist ja das gleiche in grün, was die Formatierung der Daten betrifft. Ist anstatt JSON ein PHP Array. Der Ablauf für den Bilder-Import ist bei mir in etwa so:
$productData = [
'id' => MyImportHelper::artnrToId($this->product('artnr')),
...
'media' => []
];
// load image files for artnr
$images = glob(MyImportSetting::DIR_IMAGES.$this->product['artnr'].'/*.{jpg,JPG,jpeg,JPEG,png,PNG,gif,GIF}', GLOB_BRACE);
foreach($images as $i => $sourcePath){
// resize image so we don't waste space
$this->createResizedImage($sourcePath, $sourcePath, MyImportSetting::IMG_SIZE_MAX, MyImportSetting::IMG_SIZE_MAX);
// get fileinfos
$fileExtension = pathinfo($sourcePath, PATHINFO_EXTENSION);
$fileSize = filesize($sourcePath);
$mimeType = mime_content_type($sourcePath);
$fileName = preg_replace("/[^a-z0-9]/", "-", mb_strtolower($this->product['name'])).basename($sourcePath, '.'.$fileExtension);
// get blob
$imagick = new \Imagick($sourcePath);
$blob = $imagick->getImagesBlob();
$uploadedFile = $this->fileFetcher->fetchBlob($blob, $fileExtension, $mimeType);
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('media.fileName', $fileName));
$criteria->setLimit(1);
$_media = $this->container->get('media.repository')->search($criteria, Context::createDefaultContext());
if ($_media->count() === 1) {
$mediaId = $_media->first()->getId();
}else{
$mediaId = $this->mediaService->saveFile(
$blob,
$fileExtension,
$mimeType,
$fileName,
Context::createDefaultContext(),
'product',
null,
false
);
}
if($mediaId){
if($i===0){
$productData['cover'] = [
'mediaId' => $mediaId,
'position' => $i
];
$this->coverMediaId = $mediaId;
}else{
$productData['media'][] = [
'mediaId' => $mediaId,
'position' => $i
];
}
}
}
// insert/update product
$response = $this->container->get('product.repository')->upsert(
[$productData],
Context::createDefaultContext()
);