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);