Я полностью не нашел ответа на этот вопрос. Надеюсь, кто-то здесь может помочь.Не запускайте скрипт, если он уже запущен
У меня есть PHP-скрипт (конкретный шаблон WordPress), который автоматически импортирует и обрабатывает изображения, когда пользователь нажимает на него. Проблема в том, что обработка изображений занимает много памяти, особенно если несколько пользователей одновременно обращаются к шаблону и начинают обработку изображения. Из-за этого мой сервер разбился несколько раз.
Моим решением было не выполнять функцию обработки изображений, если она уже запущена. Перед запуском функции я проверил бы запись базы данных с именем image_import_running, чтобы узнать, установлено ли значение false. Если бы это было так, функция затем выполнялась. Самое первое, что сделала функция, было установлено как image_import_running в true. Затем, после того, как все было закончено, я вернул его в false.
Он отлично работал - теоретически. С тех пор сайт не разбился, я могу вам это сказать. Но есть две основные проблемы, связанные с ней:
Если пользователь закрывает страницу, пока она загружается, скрипт никогда не заканчивает обработку изображения, и поэтому никогда не устанавливает image_import_running назад к ложным. Шаблон никогда не будет обрабатывать изображения снова, пока он не будет вручную установлен на false.
Если сценарий не работает во время обработки изображений - и это сильная возможность, если в очереди много изображений - у вас по существу та же проблема, что и № 1: сценарий никогда не доходит до точки, где он возвращает image_import_running значение false.
Для обработки № 1 (первый из двух проблем, я понял), я добавил ignore_user_abort(true)
в сценарий. Это сработало? Я не знаю, потому что № 2 по-прежнему остается проблемой. Вот где я в тупике.
Если бы я мог попросить сервер был запущен ли скрипт или нет, я мог бы сделать что-то вроде этого:
if($import_running && $script_not_running) {
$import_running = false;
}
Но как я установил, что $script_not_running
переменных? Ударь меня.
Я рассказал вам всю эту историю на всякий случай, если у вас есть другое блестящее решение.
Не делайте этого на странице просмотра. Сделайте это заранее или используйте работу cron. – GolezTrol
Исправить заболевание не является симптомом –
Как и другие, было бы лучше перенести обработку изображения из самого запроса. В качестве промежуточного «исправления» храните временную метку рядом с «image_import_running», когда начинается задание обработки (например, 'image_import_commenced'). Это очень грубый механизм, но если вы знаете максимальное время выполнения задания до тайм-аута, скрипт может проверить, прошел ли этот период времени (например, если «image_import_running» по-прежнему истинно, но текущее время больше, чем Через 10 минут после 'image_import_commenced' запустите обработку в любом случае). – plasmid87