Php 优化WordPress导入脚本

Php 优化WordPress导入脚本,php,mysql,wordpress,woocommerce,Php,Mysql,Wordpress,Woocommerce,我正在为我的Woocommerce商店做一个汽车进口商。这是可行的,但要付出巨大的资源代价。它的速度非常慢,会把网站拖慢到无用的地步。这显然是一个糟糕的开始 以下是它当前的外观: <?php $xml = simplexml_load_file( $url ); foreach ( $xml->products->product as $product ) { $one_sku = (string)$product->code; $productID

我正在为我的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;
        }
    }
}   
?>
products->productas$product){
$one_sku=(字符串)$product->code;
$productID=wc_获取_产品_id_按_sku('pre-'。$one_sku);
if($productID){
$one_description=(字符串)$product->description;
$one\u price\u批发=(字符串)$product->price->批发;
$one_price_rrp=(字符串)$product->price->rrp;
$one_image=(字符串)$product->imageurl;
$one_imageName=basename($one_image,.jpg”);
//获取WC_产品对象的实例
$woodproduct=wc\u get\u产品($productID);
//检查产品是否处于草稿状态
$productStatus=$woodproduct->get_status();
//设置产品信息。
如果($productStatus==“草稿”){
$PRODUCT->set_说明($1_说明);
$wooproduct->set_short_说明($1_说明);
$wooproduct->set_常规_价格($one_价格\u rrp);
$PRODUCT->save();
//展示最新产品
echo$dataAboutThis;
}
}
}   
?>
现在我基本上可以猜出它为什么慢了。它使用用于
set\u description
等的Woocomece函数将新数据保存到数据库中。它可能在做一些邪恶的SELECT查找,以及它需要在Woo脚本上运行的其他单调的函数和垃圾

所以基本上我只是想知道从哪里开始改进。我猜测使用WPDB insert并检查更新是否是我需要的方向。而不是使用set_函数。但是,插入数据库的最佳方式是什么呢。因为在foreach循环中查找和插入可以有成千上万个产品,这对我来说似乎不是一个好主意。我猜是某种连接。这可能是最好的做法


还值得一提的是,我的产品在这一点上已经存在。基本上,这里发生的是在创建并添加到草稿中的库存检查更新程序中获得的新产品。他们只有库存数量、状态、标题和基本要求,才能在网站上获得产品。这是在草稿中查找这些产品,将它们与xml文件匹配,然后更新它们。草稿中的内容总是少于xml文件中的内容。因此,我可能会在某个时候将foreach从xml文件切换到查找草稿产品

首先,我要说的是,你最好找到并使用一个现成的工具来解决这个问题,我通过谷歌搜索“woocommerce批量上传产品”找到了很多

您表示您正在经历一个草稿或“虚拟数据”过程,以在数据库中获取一些产品,可能是为了测试,然后您希望在其中获取完整的产品数据库,这可能会阻止您使用常规导入工具。如果是这样的话,我建议您删除该数据,就像它是真正的虚拟数据一样,然后通过常规过程导入完整的数据库

如果上述两种方法都不适合您,下面将讨论如何优化此过程:


这种类型的批处理操作得益于运行尽可能少的数据库查询,您已经猜到了这一点。除非Wordpress/WooCommerce有现成的批量导入功能,否则您必须自己构建一个,这意味着编写自定义查询

您还可以在导入过程中关闭所有MySQL索引检查,然后确保重新打开它们并在之后执行一些重新索引

如果不启用索引,则可以使用在某个查找字段上具有唯一索引的情况下,在单个步骤中执行插入/更新。这似乎是对您的问题的最佳答案,即如何避免选择以选择是更新还是插入,假设您不能仅删除少量不完整的数据并将所有内容都视为插入

您还将受益于使用,因为它将减少每个查询的毫秒数,从而基本上编译和存储查询数据库端。我不知道Wordpress DB抽象层是否支持这一点——它所基于的库(EZSQL,from way,way back)从未使用过,快速浏览代码似乎并不表明他们曾经将其添加回。因此,如果您想利用这一点,您必须自己使用PDO或mysqli来管理数据库连接

我能想到的唯一其他优化是在一个查询中批量插入几个插入,即,
插入到[表]([column1],[column2],…)值([row1-1],[row1-2],…),([row2-1],[row2-2],…)


然而,在所有这些优化中,最有效的优化可能是第一个——绕过模型,只对每一行运行一个insert查询。其他因素会影响你的数据集越大。

您好,反应很好。除了第一位。任何预先构建的东西对我们来说都是无用的,因为很多原因我们无法进入。此外,这不是虚假数据,而是新产品。看,我们都准备好了一个脚本,可以从一个简单的增量提要自动更新我们的库存。但是,如果一个产品出现在这个提要上,而我们的系统上目前没有这个产品,那么它就会用一些简单的数据jsut创建这个产品,让它启动并运行,然后将它添加到草稿中。这就是它的用武之地。这将基本上检查草稿,并更新库存检查中未提取的所有其他字段。谢谢,通过上述文档。这正是我走上正确道路所需要的。我已经很久没有处理像这样的批量数据导入和数据库了。你呢