Woocommerce - высокое использование памяти при программном обновлении вариантов продукта - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно программно обновить около 7000 вариантов продукта.

Я пробовал несколько решений и лучшую производительность, которую я получил с этим (спасибо https://wordpress.stackexchange.com/questions/189371/how-to-solve-suspected-memory-issue-in-custom-wordpress-loop):

<?php

require_once("wp-load.php");

$dealer_file = json_decode(file_get_contents('file.json'), true);

$args = array(
    'fields'         => 'ids',
    'posts_per_page' => 10, 
    'post_type'      => array('product_variation'),
    'post_status'    => 'publish',
);

$query = new WP_Query;
$paged = 1;
$count = 0;
$total = null;

do {
    $args['no_found_rows'] = isset( $total );
    $args['paged'] = $paged++;

    $post_ids = $query->query( $args );
    update_postmeta_cache( $post_ids );

    if ( ! isset( $total ) )
        $total = $query->found_posts;

    $count += $query->post_count;

    foreach ( $post_ids as $post_id ) {
        $sku = get_post_meta( $post_id, '_sku', true );

        if(!empty($sku)) {
            if ( array_key_exists( $sku, $dealer_file ) ) {
                wc_update_product_stock( $post_id, $dealer_file[ $sku ]['stock_info'] );
                echo memory_get_usage(true).'<br>';
            }
            else {
                //Log function
            }
        }

        // Wipe this post's meta from memory
        wp_cache_delete( $post_id, 'posts' );
        wp_cache_delete( $post_id, 'post_meta' );
    }

} while ( $count < $total );

?>

С помощью этого метода я использую около 600 МБ памяти (с моим кодом это было 800 МБ). Я обновился до PHP 7. Есть ли способ еще больше уменьшить использование памяти?

1 Ответ

0 голосов
/ 31 октября 2018

Проблема была в использовании wc_update_product_stock() для обновления акций. Вместо этого теперь я использую:

update_post_meta($post_id, '_stock', 'stock_number');

Общее использование ниже 30 МБ, что является превосходным IMO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...