【发布时间】:2020-05-16 22:43:43
【问题描述】:
有一个网站展示了来自数千家电子商店的产品。 他们获取所有这些网店产品的方式是通过 XML 文件。
我创建了包含我所有 2k+ 产品的 XML 文件。
为了让我创建这个 XML 产品列表,我做了一个 BIG 查询,列出了每个产品及其变量以及变量具有的每个变体。
整个查询大约需要 30-40 秒才能完成并生成我的 XML 文件。
但有时当服务器非常繁忙时,进程会失败,因为繁忙时内存太高。我已将内存限制提高到 132MB,将 max_execution_time 提高到 60 秒。但是我仍然会不时生成 XML 文件随机失败。
我应该怎么做才能使查询更快?我已经阅读了很多关于 Transient API 的内容。你认为使用它是个好主意吗?我发送 XML 文件的第 3 方网站每 1 小时请求一次。所以我为我的服务器做了一个 cron 作业,每 1 小时重新创建一次 XML,这样文件就总是包含新产品或任何更改的值。
我的主要问题是如何更快地查询所有变体/变量?
这就是我构建 XML 的方式,以防你们认为该过程不高效:
// Create the XML file
$myFile = fopen("skroutz.xml", "w+");
// XML Headers
$ex .= "<?xml version='1.0' encoding='UTF-8'?>";
$ex .= "<mywebstore>";
$ex .= "<created_at>" . date("Y-m-d H:i") . "</created_at>";
$ex .= "<products>";
// Loop through products
$loop = new WP_Query( array(
'post_type' => 'product',
'posts_per_page' => -1,
'orderby' => 'title',
'order' => 'ASC',
'tax_query' => array( array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => 113,
'operator' => 'NOT IN'
) )
) );
if ( $loop->have_posts() ) : while ( $loop->have_posts() ) : $loop->the_post();
if ( $product->is_type( 'variable' ) ){ // Check if product is Variable
...
}
endwhile;
endif;
wp_reset_query();
$ex .= "</products>";
$ex .= '</mywebstore>';
fwrite($myFile, $ex);
fclose($myFile);
【问题讨论】:
-
如果您绝对无法增加主机上的内存限制和 max_execution_time,您可以将查询拆分为多个块(例如,一次 500 个posts_per_page),暂时存储查询的偏移量。如果瞬态
offset尚不存在,请创建一个带有标题的空 XML 文件。在遍历前 500 个结果后,将偏移量存储在瞬态中,您将在下次调用 PHP 脚本时恢复。对于 2000 个产品,这需要调用脚本 4 次。您可以通过对偏移量 + 500 强制刷新(元标记/JS)来自动执行此操作 -
该死,这些听起来都太高级了,我无法编写代码。您认为上面的代码是创建 XML 文件的正确方法吗?唯一更好的性能方法是使用瞬态?
-
瞬态与查询性能无关。它们就像选项一样,但在到期时会自动删除最佳使用日期。
-
是的,你是对的。即使我创建瞬态,我也不会在性能方面获得任何好处。我只是想知道我使用
$ex .=在文件中附加内容的方法是否正确。
标签: wordpress woocommerce transient