Время для прочтения: 1 мин. 40 сек.

Запуск WP All Import из командной строки

WP All Import — это самый лучший в своей нише WordPress-плагин для импорта XML, XLS, который можно, например, использовать для синхронизации товарного каталога WooCommerce с данными 1С.

Что же с ним не так?

WP All Import не использует WP-Cron в полной мере, а требует явного вызова wp-cron.php со своими параметрами.

Фактически он требует двух вызовов: первый, так называемый триггер, запускающий импорт, и второй — шаг итерации импорта (тик), в котором обрабатывается очередная порция данных.

Разработчики рекомендуют тика ставить время повторения около 2 минут, но на практике этого времени может не хватить. Увеличение же этого времени приводит к увеличению пауз в импорте и росту общего времени импорта. В результате оно реально может вырасти до нескольких часов на больших объемах данных.

Хоть WP All Import и умеет скачивать файлы у поставщика, но работает только с кодировкой UTF-8, а большинство российских поставщиков дают те же CSV файлы в Windows-1251. Загрузки все равно требуют дополнительной обработки.

Всё это явно просится быть перенесённым на уровень серверного ПО, а не выполняться в админке WordPress или вызываться wget ом по крону. Но, к сожалению, этот плагин не умеет работать ни с WP-CLI, ни в командной строке. Так как же быть?

Решение было найдено в виде поста «WP All Import cron from CLI«.

Идея, реализованная Rolandow, заключается в прямом вызове PHP CLI сначала триггера, а потом последовательном вызове тиков WP All Import с секундной задержкой до тех пор, пока очередной тик не скажет, что импортировать больше нечего.

Какие плюсы данного подхода?

  • Так как всё выполняется через CLI — лимитов никаких нет
  • Веб-сервер (Apache, nGinx) не грузится
  • Тики итераций идут вплотную, не образуя дыр по времени
  • Данное решение удобно вешается на крон

Импорт, который до переделок занимал 10 часов и выполнялся в браузере (при этом он должен был быть в открытом состоянии), после указанной доработки — стал бегать за час-полтора. Прирост по скорости налицо.

Также стоит сказать отдельное спасибо Ивану Никитину за прекрасную доработку данного решения и доведения его до продуктового состояния.

Итак, чтобы всё это заработало, в скрипте задать следующие переменные:

  • JOB_ID — номер задания WP All Import (берется в админке WP All Import)
  • KEY — ключ для запуска (берется там же)
  • LOGFILE — имя и расположение файла лога
  • CURLOG — имя временного лога (он жизненно необходим для работы!)
  • ROOT_DIR — путь к руту сайта

Собственно, доработанный bash-скрипт:

#!/bin/bash
 
SITE="your-site.ru"
JOB_ID=999
KEY="Your-Key"
LOGFILE=/var/www/$SITE/logs/wp-all-import.log
CURLOG=/var/www/$SITE/logs/wp-all-import-$JOB_ID.tmp
ROOT_DIR=/var/www/$SITE/www
DONE=0
 
function log {
  echo "$(date): $*" >>$LOGFILE
}
 
echo "WP All Import:" $SITE " job id:" $JOB_ID
cd $ROOT_DIR
log "Start import for job id $JOB_ID"
 
php -e -r 'parse_str("import_key='$KEY'&import_id='$JOB_ID'&action=trigger", $_GET); include "wp-cron.php";' >>$LOGFILE 2>&1
sleep 1
 
while [ $DONE -eq 0 ]
do
  php -e -r 'parse_str("import_key='$KEY'&import_id='$JOB_ID'&action=processing", $_GET); include "wp-cron.php";' >$CURLOG 2>&1
  cat $CURLOG >>$LOGFILE
  DONE=$(grep 'is not triggered' $CURLOG | wc -l)
  sleep 1
done
rm $CURLOG
 
log "End of import for jobId" $JOB_ID
log ""
log ""

Комментарии и вопросы приветствуются.

Ссылки

Пошерить
Плюсануть
Отправить
Вотсапнуть

Добавить комментарий

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.

1. Нажимая на кнопку "Отправить", я даю согласие на обработку персональных данных.

2. Для вставки кода используйте специальные теги [code lang="php"]ваш код[/code]