Вышел WooCommerce 5.5.2: устранены проблемы с производительностью из-за принудительного исправления безопасности

На днях вышел WooCommerce 5.5.2. Этот релиз является продолжением к принудительному обновлению безопасности, которое устраняло уязвимость с SQL-инъекциями на прошлой неделе. Уязвимость затронула версии 3.3-5.5 плагина WooCommerce, а также версии 2.5-5.5 плагина WooCommerce Blocks. Команда выпустила патч для более 90 релизов, и этот патч был развернут в виде принудительного обновления безопасности через WordPress.org, поскольку уязвимость имела потенциальную угрозу для миллионов установок WooCommerce.

Вскоре после установки автоматического обновления многие владельцы магазинов стали сообщать о серьезных проблемах с производительностью. Некоторые пользователи сообщали о сбоях БД после установки автоматического обновления безопасности. Один из пользователей упомянул о бесконечном запросе, который попросту мешал функционировать магазину; у других пользователей аналогичный запрос приводил к серверным сбоям.

Пример такого запроса:

SELECT SQL_CALC_FOUND_ROWS  wp_posts.*, low_stock_amount_meta.meta_value AS low_stock_amount, MAX( product_lookup.date_created ) AS last_order_date FROM wp_posts  LEFT JOIN wp_wc_product_meta_lookup wc_product_meta_lookup ON wp_posts.ID = wc_product_meta_lookup.product_id  LEFT JOIN wp_postmeta AS low_stock_amount_meta ON wp_posts.ID = low_stock_amount_meta.post_id AND low_stock_amount_meta.meta_key = '_low_stock_amount'  LEFT JOIN wp_wc_order_product_lookup product_lookup ON wp_posts.ID = CASE

WHEN wp_posts.post_type = 'product' THEN product_lookup.product_id

WHEN wp_posts.post_type = 'product_variation' THEN product_lookup.variation_id

END WHERE 1=1  AND wp_posts.post_type IN ('product', 'product_variation') AND ((wp_posts.post_status = 'publish'))

AND wc_product_meta_lookup.stock_quantity IS NOT NULL

AND wc_product_meta_lookup.stock_status IN('instock','outofstock')

AND (

(

low_stock_amount_meta.meta_value > ''

AND wc_product_meta_lookup.stock_quantity <= CAST(low_stock_amount_meta.meta_value AS SIGNED)

)

OR (

(

low_stock_amount_meta.meta_value IS NULL OR low_stock_amount_meta.meta_value <= ''

)

AND wc_product_meta_lookup.stock_quantity <= 2

)

) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC, wp_posts.ID DESC LIMIT 0, 1

Чаще других страдали те, у кого в БД было много продуктов. «У нас огромная база продуктов – 17 тысяч», — отметил один из пользователей. – «Это стало настоящим кошмаром для нас».

Владельцы магазинов, затронутые данной проблемой, по рекомендациям разработчиков WooCommerce откатились к прошлым версиям. Они поделились временными обходными путями, позволяющими отключить проблемный запрос, пока WooCommerce не предложит адекватный фикс.

Неделю назад разработчик WooCommerce Адриан Даффелл сообщил, что они нашли две причины имеющейся проблемы:

  1. Медленный SQL-запрос, используемый для получения товаров, которых мало в наличии. Этот SQL-запрос присутствовал в WooCommerce в нескольких релизах.
  2. Вызов REST API, который связан с этим SQL-запросом, осуществляется в WooCommerce 5.5 в несколько раз чаще, чем в прошлых версиях.

Сочетание этих факторов приводило к снижению производительности сервера при обновлении пользователей до WooCommerce 5.5. Фикс был выпущен в WooCommerce Admin 2.4.4 и в WooCommerce 5.5.2. Пользователи, применяющие обходные пути для устранения проблемы, могут отказаться от них после обновления до свежего релиза.

Источник: wptavern.com

Блог про WordPress
Добавить комментарий

Получать новые комментарии по электронной почте.