我正在为我的Woocommerce商店做一个汽车进口商。它起作用了,但耗费了大量的资源。这是非常缓慢的,使网站的速度降低到没有用的地步。这显然是个糟糕的开始。
以下是当前的情况:
<?php
$xml = simplexml_load_file( $url );
foreach ( $xml->products->product as $product ) {
$one_sku = (string)$product->code;
$productID = wc_get_product_id_by_sku( 'pre-' . $one_sku );
if ( $productID ) {
$one_description = (string)$product->description;
$one_price_wholesale = (string)$product->price->wholesale;
$one_price_rrp = (string)$product->price->rrp;
$one_image = (string)$product->imageurl;
$one_imageName = basename($one_image, ".jpg");
// Get an instance of the WC_Product object
$wooproduct = wc_get_product( $productID );
// Check if product is in draft
$productStatus = $wooproduct->get_status();
// Set Product Information.
if ( $productStatus == 'draft' ) {
$wooproduct->set_description( $one_description );
$wooproduct->set_short_description( $one_description );
$wooproduct->set_regular_price( $one_price_rrp );
$wooproduct->save();
// Show updated products
echo $dataAboutThis;
}
}
}
?>现在我基本上可以猜出它为什么慢了。它使用WooComerce函数为set_description等保存新的数据到数据库。而且它可能正在做一些邪恶的选择查找,以及它需要在Woo脚本上运行的其他乏味的函数和垃圾。
基本上,我只是想知道从哪里开始改进这个问题。我猜使用WPDB插入并检查更新是否是我需要的方向。而不是使用set_whatever WooComerce函数。但是,插入到数据库中的最佳方法是什么。因为对我来说,在一个可以拥有成千上万个产品的前驱循环中查找和插入并不是一个好主意。我猜是某种形式的加入。也许是最好的做法。
还值得一提的是,我的产品在这一点上已经存在。基本上,这里发生的是,这是新的产品,是在库存检查更新过程中,被创建并添加到草案中的。他们只有库存的数量,状态,标题和基本要求,只是为了得到一个产品的网站。这是在草稿中查找那些产品,将它们与xml文件匹配,然后更新它们。草案中的内容总是少于xml文件。因此,我可能会在某个时候将前景从xml文件切换到查找草案产品。
发布于 2019-04-23 15:09:36
我首先要说的是,你最好找到并使用一个现成的工具来解决这个问题,我在谷歌上搜索了许多"woocommerce批量上传产品“。
您表示您正在经历一个草案或“虚拟数据”过程,以便在DB中获取一些产品,大概是用于测试,然后您想要在其中获得完整的产品DB,这可能会阻止您使用常规导入工具。如果是这样的话,我建议您删除这些数据,就好像它是真正的虚拟数据一样,然后通过常规进程导入完整的DB。
如果以上两种方法都不适合您,下面将讨论如何优化此过程:
这种类型的批处理操作可以从运行尽可能少的数据库查询中获益,您已经猜到了这一点。除非Wordpress/WooCommerce有现成的批处理导入函数,否则您必须自己构建一个,这意味着编写自定义查询。
您还可以在导入过程中关闭所有MySQL索引检查:https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html,然后确保打开它们并在之后执行一些重新索引。
如果确实保留索引,则可以使用插入..。关于重复键更新语法在一个步骤中执行insert/update,只要在某些查找字段上有唯一索引即可。这似乎是对您的问题的最佳回答,即如何避免选择,以选择是更新还是插入,前提是您不能删除少量不完整的数据,并将所有内容视为插入。
您还将受益于使用准备好的语句或存储过程,因为它将减少每个查询加起来的毫秒时间,从而实质上编译和存储查询DB端。我不知道Wordpress DB抽象层是否支持这一功能--它所基于的库(EZSQL,由来已久)从未被使用过,而快速查看代码似乎并不表明他们曾经将其添加回。因此,如果您想利用这一点,您必须自己管理与PDO或mysqli的数据库连接。
我唯一能想到的其他优化就是对单个查询中的几个插入进行批量处理,即INSERT INTO [table] ([column1], [column2], ...) VALUES ([row1-1], [row1-2], ...), ([row2-1], [row2-2], ...);
然而,在所有这些中,最有影响的优化可能是首先绕过模型,只对每一行运行一个insert查询。数据集越大,其他数据就越重要。
https://stackoverflow.com/questions/55813141
复制相似问题