Как убрать ограничение времени выполнения функции в Wordpress?
Здравствуйте, хотелось бы узнать и понять некоторые моменты.
Есть функция которая импортирует посты (свой плагин), она объемная и занимает большое количество времени.
И отсюда вытекают вопросы:
1. Какие моменты нужно учитывать при запуске объемной задачи ?
2. Как убрать ограничение ожидания выполнения функции ?
3. Как запускать функцию в фоновом режиме ? Т.е. своего рода планировщик задач. Поставил время и она сама по себе запускается))
iXelper, Она объемная, она занимает большое кол-во времени, она может прерваться, может упасть из за памяти, из за того, что звезды не так встали в эту секунду.
Посмотрите в поиске проблемы работы долгих скриптов и варианты решения. Как вариант - разбивать на части
Антон, не "как вариант", а единственный вариант разбивать на части.
Допустим, локально или на своем серваке он сможет отключить/увеличить лимит, но на нормальном хостинге ему так сделать не дадут. Потому как он там не один и любая нагрузка такой сервак уронит
Даже если он сможет его оптимизировать, чтоб оно работало быстрее, лучше такие долгие вещи бить на части, запускать кусочками
iXelper, вот такие варианты:
1 использовать существующие плагины для импорта/экспорта
2 использовать wp-cli
3 залить готовый дамп
4 использовать стандартные средства WP для импорта/экспорта
5 написать свой скрипт, который будет заливать частями
в большей степени выбор варианта зависит от того, в каком формате у вас сейчас посты.
в некоторых случаях будет проще поменять текущий формат под более удобный способ
использовать свое решение стоит только:
1 если у вас там все супер сложно, нужны какие-то события при импорте каждого поста (к примеру, нужно тут же его пушить в соцсеть или на почту юзерам ссылку отправлять)
2 если у вас уже есть зачем-то написанное свое решение
во всех остальных случаях под эту задачу проще взять готовое
Дмитрий, Да, мы используем свое решение, собираем готовый пост с помощью api. К сожалению готового функционала нет для таких задач.
Если заливать по частям, каким образом это можно реализовать ?
У нас есть список идентификаторов, по которым заливаются посты, но получается их нужно разделить.
Если я правильно понимаю то функция и будет работать, а у неё лимит по времени :(
Поправьте пожалуйста если ошибаюсь и дайте пинок в какую сторону рыть
iXelper, ну, если вы так настроены в сторону своего решения
на самом деле там все просто.
1 если это у вас все это в каким-то файле и вы его загружаете руками.
привязываться к времени выполнения нельзя, каждый кусок может выполняться разное количество времени по разным причинам. Поэтому смотрим общее к-во элементов, делим их на части по 100/200/1000 (выясняем опытном путем какое к-во постов гарантированно выходит добавить за раз и ставим чуть меньше).
Затем на фронте или в админке делаем форму, куда пихаем инпут для загрузки файла. Вешаем скрипт, который будет перехватывать сабмит.
По сабмиту аяксом шлем этот файл в WP и отправляем текущий номер части (0)
На стороне WP ловим этот файл, читаем строки с 0+100*0 по 100+100*0 (100 - это число, на сколько у вас там поделено, 0 - текущяя группа).
Прасим, импортируем эту маленькую группку, возвращаем ответ на фронт, что все ок, группа 0 отработана.
Скрипт на фронте получает ответ, инициирует отправку повторно уже для группы 0+1.
Так, пока по всему файлу не пройдет.
Чуть улучшить можно если использовать на фронте библиотечки, которые парсят csv файлы и умеют отправлять только нужную часть. Но смысл все равно будет примерно такой же.
2 если хотите делать это сервером
логика абсолютно такая же - делим, делаем частями.
только вместо скрипта на фронте инициировать все это дело будет крон.
по звавершении импорта батча (ну или каждой строки), нужно будет в базу писать айдишку/строку последнего импортированного поста.
Тут нужно будет обратить внимание, что в WP крон не настоящий. Импорт может подзатянуться. Лучше воспользоваться кроном сервера
Написал много, но и то, и то довольно быстро сделать