我尝试在prestashop电子商务中定期高效地导入15k+产品,解析ascii文件(3.5mb),并且只使用prestashop的api。
所有都在docker下运行,官方图片来自docker hub。
如果不存在具有相同引用字段的产品,我将不得不插入一个新产品(如果有)来更新它。我开发了一个模块,可以通过点击自定义的管理选项卡来实现这个功能,它可以工作,但是整个系统会冻结,直到进程完成或终止:(大约77分钟)。我还尝试将(不太大的)大文件拆分为500、100、50块,但处理时间呈线性减少,没有多大帮助:
500个元素平均153秒
100个元素平均31秒
50个元素平均15秒
我当然可以每90秒配置一个cron来处理50个元素,并在每晚7-8小时内完成整个导入,但这似乎是一个非常糟糕的妥协:每90秒离线15秒。
我不能使用pthreads,因为这将是一个生产web服务器。
我试着调整apache,增加内存限制,最大输入变量,最大执行时间,但没有任何区别:db使用450mb到550mb的ram和服务器几乎相同。
linux#1 smp debian 4.9.110-3+deb9u6(2018-10-08)x86Š64
versione软件del服务器:apache/2.4.10(debian)
版本:5.6.35
内存限制=2048m
最大输入变量=1000000
最大执行时间=600000
mysql:5.6.40版本
我是以错误的方式面对这个问题,还是prestashop的api性能不好,不适合批量(和性能)产品导入?
public function batchImportAllProductsFromFile($productsToBeInserted){
foreach ($productsToBeInserted as $key => $customProduct ) {
$productIDs = $this->getProductIDsByReference($customProduct->MS_CODMAG);
if (sizeof($productIDs) == 0) {
$product = new Product();
} else if (sizeof($productIDs) == 1) {
$product = new Product($productIDs[0]);
} else {
continue;
}
$product->reference = $customProduct->MS_CODMAG;
$product->name = trim($customProduct->MS_DESCRIZIONE);
$product->price = $customProduct->MS_PREZZO_1;
$product->out_of_stock = ($customProduct ->MS_ESAURITO === "S" ? true : false);
$category = null;
$msGruppoConverted = $this->buildSubGroupCode($customProduct->MS_GRUPPO, $customProduct->MS_SGRUPPO);
if ($customProduct->MS_GRUPPO !== 0 && $msGruppoConverted !== 0) {
$product->id_category = [$customProduct->MS_GRUPPO, $msGruppoConverted];
} else if ($customProduct->MS_GRUPPO === 0 && $msGruppoConverted !== 0) {
$product->id_category = [$msGruppoConverted];
} else if ($customProduct ->MS_GRUPPO !== 0 && $msGruppoConverted === 0) {
$product->id_category = [$customProduct->MS_GRUPPO];
}
try {
if (sizeof($productIDs) == 0) {
if ($product->add()) {
$product->updateCategories($product->category);
$product->addFeatureProductImport($product->id, 1, $customProduct->MS_FAM);
//StockAvailable::setQuantity((int)$product->id, 0, $product->quantity, Context::getContext()->shop->id);
}
} else if (sizeof($productIDs) == 1) {
if ($product->update()) {
$product->updateCategories($product->category);
$alreadySavedFeatures = $product->getFeaturesStatic($productIDs[0]);
if (sizeof($alreadySavedFeatures) != 1 || $alreadySavedFeatures[0] != $customProduct->MS_FAM) {
$product->deleteProductFeatures();
$product->addFeatureProductImport($product->id, 1, $customProduct->MS_FAM);
}
}
}
} catch (Exception $e) {
var_dump("Errore: ", $e, $product);
}
}
}
编辑:2018年10月22日:
升级到php7.2并使用mariadb 10.3.10并没有给我带来任何变化:时间安排还是一样的。带来好处的是安装fs(ext4),db在/etc/fstab中存储选项barlers=0的信息:500个元素的性能从153秒提高到35秒,总共大约18分钟(77分钟)。
仍然存在的问题是,为什么系统在导入时没有响应。
2条答案
按热度按时间w8ntj3qf1#
在更新之前,您应该检查您的产品是否需要更新。
以下是我在prestashop上导入实体时所做的操作(高度简化):
如果没有修改,导入将立即完成,因为没有正在处理的查询。
关于你的安装冻结,这似乎是一个码头问题,而不是联系到prestashop。
正如@bruno leveque所提到的,您应该考虑升级到php7。
eoxn13cs2#
真正解决了导入产品时prestashop被卡住的问题的方法是将代码从moduleadmincontroller中移动到WebServicesSpecificManagementInterface:这样导入就可以在后台进行,而不会使系统饱和。