Wordpress. Оптимизация своего плагина?

Добрый день!
Помогите пожалуйста разобраться с оптимизацией "долгого" скрипта. В PHP, WP я не силен.
В рамках профессии "тыжпрограммист", набросал простенький плагин, который загружает xml-файл товаров и категорий формата Яндекс.Магазин (yandex_catalog). Делает парсинг xml, записывает данные во временные таблицы, затем "генерирует" категории товаров и сами товары в формат, понятный WP с помощью wp_insert_post, wp_insert_term и пр..
Для товаров и категорий используется portfolio custom taxonomy (cherry framework). Товары нужны не как товары интернет-магазина, а как каталог продукции.
Проблема возникла в производительности скрипта, дело в том что кол-во позиций товаров - over 1.2k, плюс ко всему прочему необходимо подгружать изображения этих товаров напрямую с другого сайта, сохраняя их в медиа-библиотеку, затем прикрепляя к посту. Скрипт долго висит, в это время нормально происходит импорт, и через 30 дефолтных секунд отваливается по таймауту: Fatal error: Maximum execution time of 30 seconds exceeded...
Из-за нехватки знаний и опыта, ничего другого не придумал кроме set_time_limit(1000). За это время все импортируется, но это ведь совсем не хорошо, да?
Подскажите как можно обойти таймаут на долгое выполнение? Распараллелить, как вариант, но без особых заморочек, я не знаток PHP.
Рассматривал порционирование "генерации" товаров с помощью задания cron через wp_schedule_event, но у него регламент по времени - час минимум, что для 1.2к товаров не хорошо.
Плагины импорта рассматривал, - не подошли.
  • Вопрос задан
  • 2879 просмотров
Решения вопроса 1
rOOse
@rOOse
Frontend developer
wp_schedule_event не настоящий cron: "The action will trigger when someone visits your WordPress site"("Действие запускается когда кто-то посещает ваш сайт")

к wp_schedule_event можно создавать свои интервалы.

я бы сделал наверное так:
1. получил бы файл, сохранил его, записал в базу путь и данные с какого элемента и кол-во элементов нужно спарсить, запустить wp_schedule_event к примеру через 5 минут.
2. по wp_schedule_event через 5 минут распарсил кол-во заданных элементов, добавил записи, обновил запись в базе - стартовую позицию, wp_schedule_event через 5 мин. и т.д.

но, тут нужен настоящий крон я так думаю, с псевдо кроном ВП 100% гарантии запуска события нет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Все долгие операции нужно запускать из консоли. Для консоли времени выполнения нет.
Ответ написан
@begemot_nn
самый простой, возможно не самый красивый способ - писать куда то прогресс выполнения задачи.
1. забрать и распарсить xml - это быстро, после этого этапа скрипт уже знает сколько позиций ему предстоит обработать. (так ведь?)
2. обрабатываем в цикле позиции, после обработки каждой позиции пишем ее ID в таблицу (файл).
3. скрипт перезапускаем до тех пор пока циферка из шага 2 не сравняется с количеством позиций из принятого xml (это количество можно так же посчитать один раз на шаге 1 и больше не вычислять.)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы