Замедляют ли задания WordPress cron загрузку страниц?

8

Если пользователь посещает сайт, и его посещение вызывает довольно интенсивную работу cron, скорость загрузки страницы для него будет медленнее, верно? Как я понимаю, страница не ожидает выполнения задания cron перед загрузкой, но поскольку задание cron будет выполняться параллельно, возможно, страница все равно загружается медленнее, поскольку сервер занят, верно?

urok93
источник
Прочитайте статью о spawn_cron, которая может вам помочь: codex.wordpress.org/Function_Reference/spawn_cron
TomC
Если ваша задача cron достаточно тяжелая, чтобы сервер был занят, то она достаточно тяжелая, чтобы сервер был занят. Я не совсем понимаю, что ваш вопрос - чтобы подтвердить это?
Rarst
Да, я просто хотел подтвердить это, так как я читал, что загрузки страниц и задания cron выполняются независимо, поэтому загрузка страниц не затрагивается. Однако если, как вы говорите, задание cron достаточно тяжелое, это повлияет на загрузку страницы как побочный эффект.
urok93

Ответы:

10

Краткий ответ - Нет . Любой запрос страницы инициализирует запланированную очередь. Это просто запрос инициализации. Запрос wp-cron является отдельным запросом.

поэтому, запрашивая URL, /somepageвы просто инициализируете запрос/wp-cron.php

Однако - если событие cron работает не очень хорошо (оно имеет 1000 запросов дБ, например, или оно запрашивает какой-то действительно длинный для ответа ресурс), или оба, или перепланирует событие cron для каждого запроса ... как и любой другой другой http-запрос потребляет ресурсы, производительность процессора, память и т. д. Если он потребляет достаточно ресурсов, ваша страница будет работать медленнее.

Олег Бутузов
источник
9

Короткий ответ на самом деле да , в большинстве случаев.

Во-первых, в большинстве установок порождение задания cron приводит к задержке в 1 секунду при загрузке страницы, потому что это выполняется через HTTP-запрос обратной связи с тайм-аутом в 1 секунду - см. Https://wordpress.org/support/topic/save. -a-полное-второе-на-cron-выполнение / .

Во-вторых, порожденное задание теперь будет конкурировать с загрузкой страницы для доступа к базе данных (а также для других ресурсов). Несколько процессов могут читать базу данных одновременно; однако всякий раз, когда процесс выполняет запись в базу данных, по умолчанию он блокируется, чтобы предотвратить одновременный доступ на запись или чтение любым другим процессом - см. /programming/1005206/does-sqlite-lock-the-database. -file-on-reads # answer-1005218 . Влияние этого зависит от того, насколько сложны обновления базы данных задания cron и как долго база данных фактически заблокирована, и может быть незначительной. Конечно, это также было бы проблемой, если бы задание cron выполнялось при запросе страницы, но при этом задания cron появлялись с гарантией загрузки страницы. они будут влиять как минимум на загрузку этой страницы.

Если ваш сервер / хостинг позволяет, рекомендуется настроить запланированное задание cron для запуска каждые несколько часов с помощью команды

php -q /path/to/wp-cron.php

и отключить порождение cron при загрузке страницы с помощью следующей записи в wp-config.php:

define('DISABLE_WP_CRON', true);
Джейк
источник
1
Это настоящий ответ.
ILikeTurtles
Согласно статье, задержка в 1 секунду происходит в версиях cURL ниже 7.15.5. Он отлично работает на версиях curl от 7.15.5 и выше. 7.15.5 был выпущен в августе 2006 года. Больше нет тайм-аута в 1 секунду, кроме как на действительно старых установках.
user63350
@ user63350 Это верно для cURL, но не для WordPress. Из статьи: «класс WP_Http_Curl настраивает дробное время ожидания до одной полной секунды (даже если cURL его поддержит)». Даже в последней версии WordPress (5.2.2) время ожидания составляет 1 секунду, поэтому проблема присутствует во всех настройках, включая самую последнюю.
Джейк
На самом деле тайм-аут на 1 секунду был исправлен в WordPress 4.6 с помощью # 33055 . (Взгляд на базу кода сбивает с толку, поскольку старый код все еще там, включая privateтакие методы, WP_Http::_dispatch_requestкоторые сейчас никогда не вызываются.)
Джейк