• Блог
  • Фоновые скрипты, таймер

Вот и новая версия 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(), которая разбирает аргументы из командной строки и выводит их в ассоциативном массиве. Соответственно, поправил файл коннектора.

0   3207

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.