Как именно работают автоматические обновления?

28

Сегодня утром я получил электронное письмо, в котором говорилось, что мой сайт Wordpress был автоматически обновлен до последней версии. Я знал об этой функции, но мне всегда было интересно, как именно она работает.

PHP не является постоянно запущенным процессом: он запускается только по запросу. Итак, насколько я могу судить, Wordpress может обновляться только тогда, когда кто-то загружает веб-страницу. Но процесс обновления не происходит мгновенно, поэтому пользователь, посещающий сайт, будет очень медленно загружать страницу.

Есть ли другой трюк, который они используют для автоматического обновления? Я искал повсюду, но не нашел никакого объяснения.

DisgruntledGoat
источник
Просто чтобы быть точным, оно будет обновляться только тогда, когда будет выпущено новое второстепенное обновление или обновление безопасности, например, с 3.8 до 3.8.1, но когда выйдет 3.9 (как обновление основной версии), вам придется делать это вручную.
Борек

Ответы:

15

PHP не является постоянно запущенным процессом: он запускается только по запросу. Итак, насколько я могу судить, Wordpress может обновляться только тогда, когда кто-то загружает веб-страницу. Но процесс обновления не происходит мгновенно, поэтому пользователь, посещающий сайт, будет очень медленно загружать страницу.

Есть ли другой трюк, который они используют для автоматического обновления? Я искал повсюду, но не нашел никакого объяснения.

Система, которую вы ищете здесь, называется "WP Cron". Это система фоновых процессов в WordPress, которая позволяет событиям происходить вне обычной обработки. Им все еще нужен триггер, чтобы запустить их, но они не мешают загрузке страниц из-за фонового процесса.

Так что да, кто-то должен загрузить вашу страницу. Выключенный в файле default-filters.php, вы найдете следующую строку кода:

add_action( 'init', 'wp_cron' );

Итак, при каждой загрузке страницы запускается функция wp_cron. Эта функция завершена в wp-includes / cron.php, и она проверяет запланированные события в базе данных. Если есть какие-то процессы, которые он должен запускать в фоновом режиме, он вызывает функцию spawn_cron.

Spawn cron имеет два возможных метода работы, но первым и наиболее распространенным является вызов функции wp_remote_post для установления соединения с самим собой по URL-адресу wp-cron.php. Делая этот дополнительный HTTP-запрос, он запускает другой процесс PHP, чтобы выполнить всю реальную работу. Запрос, который он делает здесь, является неблокирующим, с таймаутом 0,01 секунды. Таким образом, это не дает никаких результатов. Цель запроса - просто запустить новый процесс в фоновом режиме. После того, как это сделано, он просто возвращается, так что у пользователя просмотра никогда не возникает никаких задержек.

Процесс wp-cron.php - это то, что выполняет реальную работу, обновление и все остальное. Многие процессы в WordPress обрабатываются системой cron. Запланированная публикация после публикации, обработка пингов, проверка обновлений, все, что должно происходить вне обычного потока, может быть запланировано и затем выполнено по мере необходимости.

Но да, нормальное попадание на сайт действительно должно произойти, чтобы начать процесс. И нет, WordPress.org не связывается с вашим сайтом напрямую, чтобы начать работу, ваш сайт должен получать некоторую форму трафика, чтобы запустить его. Подойдет любая форма трафика.

эфирное масло
источник
17

На самом деле, автоматическое обновление выталкивается из wp.org. Процесс обновления все еще выполняется на вашем сайте, но в фоновом режиме через wp-cron.

Когда выходит новое незначительное обновление, ребята из WordPress начинают выкатывать это обновление. Фактический процесс обновления начинается после того, как ваш сайт проверил wp.orgналичие обновлений, обновление теоретически доступно, и ваш сайт выбран случайным образом для обновления.


(Спасибо @otto за указание на мою неправильную формулировку :))


Поскольку каждый сайт проверяет wp.orgналичие новых версий (обычно дважды в день wp-cron), сервер развертывания знает, сколько сайтов нуждается в обновлении.

Затем начинается развертывание, которое начинается медленно - 1 из 128 сайтов обновляется автоматически. Это отслеживается, и если успешное завершение указывает на отсутствие проблем с развертыванием, все больше сайтов получают автоматическое обновление (обычно следующим шагом будет 1 из 64 и продолжит увеличиваться таким образом), пока все автоматические обновления не будут доставлены.

Это позволяет разработчикам остановить развертывание, если возникнут какие-либо проблемы, но при последнем обновлении с 3.8до 3.8.1100% успеха.

Сайты, выбранные на 1 out of 128самом деле случайные. Ну, не совсем, но если вы хотите знать, это работает так:

URL сайта, нуждающегося в обновлении, хэшируется с помощью MD5. Используя только первые три символа этого хэша и конвертируя его base10, получается 4096 возможностей. Обновление началось для сайтов с расчетным числом от 0 до 31 (4096/32 = 128).

Хорошо, я думаю, это довольно случайно;)

В моем случае, когда я запускаю много сайтов WordPress, обновления заняли 1 день - было довольно забавно видеть, когда все страницы были обновлены.

На всякий случай вам было интересно: D

Кстати, вот статья на make.wordpress.org, описывающая процесс, как он произошел.

fischi
источник
Если он «запущен по запросу с wp.org на ваш сайт», насколько это безопасно? Не мог ли кто-нибудь отправить запрос на ваш сайт?
Рассерженная шлюха
На самом деле, я не знаю, как это обрабатывается технически. Но я уверен, что есть проверки безопасности, такие как nonce и / или откуда приходит запрос.
fischi
1
@fischi Вы получили информацию, с которой wp.org инициирует обновление? Существует большая разница между wp.org, инициирующим обновление или сайтом WordPress, проверяющим наличие обновлений, а затем инициирующим само обновление, если wp.org сообщает, что имеются обновления.
kraftner
1
Этот ответ на самом деле неверен. Процесс обновления не инициируется WordPress.org на ваш сайт. Ваш сайт действительно должен иметь некоторую форму трафика, чтобы запустить его, но WordPress.org не пингует ваш сайт напрямую.
Отто
1
Хорошо, но "запущено по запросу с wp.org на ваш сайт" неверно. Ваш сайт отправляет запрос на обновление, а в ответе указывается, есть обновление или нет. Это не наоборот, ваш сайт должен инициировать процесс.
Отто
1

В самых общих чертах, когда пользователь посещает сайт, WordPress проверяет истечение таймера и, если истечение обнаруживается, на сервер отправляется другой запрос на «выполнение» действий, связанных с событием с истекшим сроком действия. Вот почему пользователь не чувствует заметной задержки при загрузке страницы, так как сервер выполняет фактическое действие (в данном случае обновление) в отдельном процессе.

Это работает, но время не очень точное. Чем больше трафика у вашего сайта, тем точнее он будет.

Люди, которые хотят получить более высокую производительность и более точную синхронизацию, могут заблокировать встроенный WordPress «процесс» cron и использовать процесс cron ОС для запуска проверки таймеров.

Марк Каплун
источник