shutdown
Спрацьовує в момент, коли PHP скрипт завершив усі свої операції або була викликана функція exit() .
Хук спрацює в будь-яких умовах, наприклад, якщо закінчився час виконання скрипту або скрипт обірваний через exit або якось ще, тому через нього зручно ловити якісь непередбачену логіку і якось обробляти або його зручно використовувати коли потрібно, щоб код був виконаний. в будь-якій ситуації.
Принцип роботи хука такий: на PHP функцію register_shutdown_function() повішена функція shutdown_action_hook() , яка, у свою чергу, викликає хук shutdown :
// Реєстрація функції, яка спрацює перед завершенням роботи скрипту
register_shutdown_function( 'shutdown_action_hook');
// Сама функція
function shutdown_action_hook() {
// Описуваний хук
do_action( 'shutdown');
wp_cache_close();
}Використання
add_action( 'shutdown', 'wp_kama_shutdown_action');
/**
* Function for `shutdown` action-hook.
*
* @return void
*/
function wp_kama_shutdown_action(){
// action...
}Приклади
#1 Додавання безмежної кількості записів
Коли потрібно додати багато записів у базу даних, можна зіткнутися з проблемою: сервер зупиняє скрипт, що працює, через обмеження часу виконання скрипта (як правило 30 секунд). Це обмеження можна обійти за допомогою хука shutdown . Проте, такий обхід можна зробити не всіх серверах, тобто. це залежить від налаштувань сервера (викликає сервер функцію register_shutdown_function() щоразу при перевищенні ліміту часу роботи PHP).
Цей код лише для прикладу:
## Запускає процес генерації записів через додавання URL параметра init_new_posts_creation.
if ( isset( $_GET['init_new_posts_creation'] ) ) {
// Запускає додавання записів до бази.
add_action( 'init', 'create_new_posts');
// Коли скрипт буде зупинено сервером, спрацює цей хук і запустить цю функцію.
add_action( 'shutdown', 'reinit_create_new_posts');
}
## Запускає процес створення записів.
## Записує тривалість процесу генерації записів у секундах.
function reinit_create_new_posts() {
// перерахуємо те, що там у нас набралося...
wp_defer_term_counting(false);
wp_defer_comment_counting(false);
// Запускає процес створення записів.
create_new_posts();
}
## Додає тестові записи до бази даних.
function create_new_posts() {
static $index, $bigest_id;
$creat_posts = (int) ($_GET['init_new_posts_creation']?: 10); // Скільки постів створити?
// функція запустилася вперше
if( $index === null ){
Global $wpdb;
$bigest_id = $wpdb->get_var("SELECT MAX(ID) FROM $wpdb->posts")?: 1;
$index = $bigest_id;
}
else {
// Скільки ще залишилося створити?
$creat_posts = $creat_posts - ($index - $bigest_id);
$bigest_id = $index;
}
// Все створено!
if( $creat_posts <= 0 ){
/ / Записує час виконання генерації записів.
update_option( 'time_spent_to_create_posts', timer_stop(), false );
return;
}
// Відключаємо операції, які уповільнюють додавання записів.
wp_suspend_cache_addition (true);
wp_defer_term_counting (true);
wp_defer_comment_counting (true);
// Генерує масив, що визначає кількість записів, що генеруються.
$range = range($bigest_id, $bigest_id + $creat_posts);
foreach ($range as $id) {
sleep(1);
// Дані записи.
$post_data = [
'post_title' => 'Заголовок запису' . $id,
'post_content' => 'Тут має бути контент (текст) запису' . $id,
'post_status' => 'draft', // з таким статусом запис додається швидше,
// потім одним разом змінимо у всіх доданих
// записів на publish
];
// Додає запис до бази даних.
wp_insert_post(wp_slash($post_data));
$index++;
}
wp_defer_term_counting (false);
wp_defer_comment_counting(false);
}
список змін
| З версії 1.2.0 | Введено. |
Де викликається хук
do_action( 'shutdown');
Де використовується хук у WordPress
add_action( 'shutdown', 'wp_ob_end_flush_all', 1);