[modHelpers] Фоновые скрипты, таймер
Вот и новая версия 3.7.0 вышла. Что она нам сулит:
- Добавлена новая функция «exec_bg_script».
- Добавлена новая функция «timer».
- Добавлены 2 метода «subDomain» и «subDomains»в класс Request.
- Добавлен метод «storeAsOriginal» в класс UploadedFile.
Функция exec_bg_script()
Она позволяет выполнять указанный скрипт в фоновом режиме. Т.е. также, как это делает cron. Эта функция будет полезна, когда нужно выполнить ресурсоёмкую задачу задачу, привязанную к запросу. Выполняя её параллельно, мы тем самым разгружаем запрос, и он вернётся пользователю значительно быстрее. Хотя можно и в админке через консоль поработать с ресурсами. Например, пересоздать алиасы.
Надо понимать, что скрипт, выполненный таким образом, не вернёт данные пользователю в запрос. Но он может отправить почту (достаточно долгая операция), обработать картинку, полученную в запросе, провести определённые вычисления, связанные со статистикой запросов, и т.д.
// Запуск скрипта, находящегося в корне сайта exec_bg_script('action.php', ['param1' => 'value1', 'param2' => 'value2']);
Я подготовил небольшое видео с демонстрацией использования данной функции.
<?php # Пример коннектора (точки входа) // Пропускаем только запросы из командной строки (если нужно) if (php_sapi_name() != 'cli') { header("HTTP/1.1 404 Not Found"); exit(); } // Инициализируем MODX define('MODX_API_MODE', true); require_once __DIR__.'/index.php'; $modx->getService('error','error.modError'); // Получаем массив параметров из командой строки $_REQUEST = get_exec_args(); // Проверка безопасности if (empty($_REQUEST['token']) || $_REQUEST['token'] !== '123456789') { header("HTTP/1.1 403 Forbidden"); die('Access denied'); } // Эмулируем долгую работу скрипта sleep((int)$_REQUEST['time']); // Выводим массив с параметрами запроса $modx->log(1, print_r($_REQUEST, 1));
Помните!
В скрипте, запущенным из командной строки, данные из сессии будут недоступны по причине отсутствия кук (как и в случае с cron). Поэтому нужную информацию из неё передавайте в параметрах или через кэш.
Функция timer()
Эта функция пригодится при отладке кода. Использовать её достаточно просто.
timer()->checkpoint('Старт'); ...some code 1 timer()->checkpoint('Шаг 1'); // можно использовать короткий синтаксис - cp() ...some code 2 echo timer()->cp('Шаг 2')->total('Итого.'); // // или можно вызвать ниже по коду timer()->total(); # Result 0,000: Старт. 1,000: Шаг 1. 1,000: Шаг 2. 2,000: Итого.
Можно запускать разные таймеры. Для этого в функцию первым параметром нужно передать имя таймера.
// Первый таймер timer('timer1')->cp('Старт таймер 1'); ...some code // Второй таймер timer('timer2')->cp('Старт таймер 2'); ...some code echo timer('timer2')->cp('Стоп таймер 2')->total(); ...some code echo timer('timer1')->cp('Стоп таймер 1')->total('Пользователькое сообщение для total');
Доработка класса Request
При работе с поддоменами пригодятся 2 новых метода — subDomains
и subDomain
. Первый формирует массив поддоменов из адресной строки. А второй позволяет обращаться по порядковому номеру. Полная аналогия с методами segments
и segment
. Т.е. логика следующая: sub2.sub1.domain.ru/segment1/segment2
.
Доработка класса UploadedFile
Добавлен метод storeAsOriginal
, который позволяет сохранить загруженный файл с оригинальным именем, а не хэшем. Достаточно передать только путь для сохранения.
На этом пока всё.
P.S. В догонку выпустил версию с функцией get_exec_args()
, которая разбирает аргументы из командной строки и выводит их в ассоциативном массиве. Соответственно, поправил файл коннектора.
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()