1. Go to this page and download the library: Download shasoft/batch library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
shasoft / batch example snippets
// Функция для получения асинхронных данных и их возврата в синхронный код
// Анонимная функция должно возвращать обещание,
// результат которого и будет возвращен из функции run
$articles = BatchManager::run(function (): BatchPromise {
// Функция all выполняет массив обещаний
// и возвращает массив значений этих обещаний
return BatchManager::all([
getArticle(1),
getArticle(2),
getArticle(3)
]);
});
// Получить информацию о статье
function getArticle(int $id): BatchPromise
{
// Создаем и возвращаем обещание
return BatchManager::create(
// Функция для обработки сгруппированных данных
function (BatchGroup $group) {
// Получить список уникальных значений аргумента с номером 0
$ids = $group->arg(0);
// Выбрать из БД информацию о статьях
$articles = sql('SELECT * FROM `articles` WHERE `id` IN (' . implode(',', $ids) . ')');
// Создадим обещания получения информации о пользователях
$promises = [];
foreach ($articles as $article) {
$promises[] = getUser($article['author_id']);
}
BatchManager::all($promises)->then(function (array $users) use ($articles, $group) {
// Сгруппировать пользователей по идентификатору
$mUsers = [];
foreach ($users as $user) {
$mUsers[$user['id']] = $user;
}
// Проставить информацию об авторе
foreach ($articles as $article) {
$article['author'] = $mUsers[$article['author_id']];
}
// Сгруппировать статьи по идентификатору
$mArticles = [];
foreach ($articles as $article) {
$mArticles[$article['id']] = $article;
}
// Вернуть информацию о статьях
$group->setResult(function (int $id) use ($mArticles) {
return $mArticles[$id] ?? null;
});
});
},
$id // Функция имеет только один аргумент (его номер = 0)
);
}
// Получить информацию о пользователе
function getUser(int $id): BatchPromise
{
// Создаем и возвращаем обещание
return BatchManager::create(
// Функция для обработки сгруппированных данных
function (BatchGroup $group) {
// Получить список уникальных значений аргумента с номером 0
$ids = $group->arg(0);
// Выбрать из БД информацию о пользователях
$users = sql('SELECT * FROM `users` WHERE `id` IN (' . implode(',', $ids) . ')');
// Сгруппировать пользователей по идентификатору
$mUsers = [];
foreach ($users as $user) {
$mUsers[$user['id']] = $user;
}
// Вернуть информацию о пользователе
$group->setResult(function (int $id) use ($mUsers) {
return $mUsers[$id] ?? null;
});
},
$id // Функция имеет только один аргумент (его номер = 0)
);
}
$articles = BatchManager::run(function (): BatchPromise {
return getArticle(1)
->then(function($article) {
// Функция получает значение, его можно изменить
$article['genderName'] = $article['gender']=='M' ? 'мужчина' : 'женщина';
// и передать дальше по цепочке
return $article;
})
->then(function($article) {
// Функция получает значение, его можно изменить
if( empty($article['avatar']) {
$article['avatar'] = '/avatar/default.png';
}
// и передать дальше по цепочке
return $article;
});
});
// Получить информацию о пользователе
function getUser(int $id): BatchPromise
{
// Создаем и возвращаем обещание
return BatchManager::create(
// Функция для обработки сгруппированных данных
function (BatchGroup $group) {
// Получить список уникальных значений аргументов с номером 0
$ids = $group->arg(0);
// Выбрать из БД информацию о пользователях
$users = sql('SELECT * FROM `users` WHERE `id` IN (' . implode(',', $ids) . ')');
// Сгруппировать пользователей по идентификатору
$mUsers = [];
foreach ($users as $user) {
$mUsers[$user['id']] = $user;
}
// Вернуть информацию о пользователе
$group->setResult(function (int $id) use ($mUsers) {
// Возвращаем ошибку если по идентификатору ничего не выбралось
return $mUsers[$id] ?? BatchError::create("Пользователь {$id} не найден",$id);
});
},
$id
);
}
// Работа с ошибками
class BatchError
{
// Создать ошибку
static public function create(string $message, ?int $code = null): static;
// Создать ошибку отсутствия значения
static public function createUndefined(): static;
// Значение является ошибкой?
static public function has(mixed $value): bool;
// Все значения массив являются ошибками?
static public function hasErrors(array $values): bool;
// Отфильтровать массив значений удалив: true - ошибки/ false - не ошибки
static public function filter(array $values, bool $removeError = true): array;
// Заполнить ошибки значениями
static public function fill(array $values, mixed $value): array;
}
// Получить информацию о пользователе
function getUser(int $id): BatchPromise
{
// Создаем и возвращаем обещание
return BatchManager::createEx(
// Функция указания расширенных настроек
function (BatchGroupConfig $config) {
// Указываем пониженный приоритет (чтобы эта группа выполнялась последней)
$config->setPriority(BatchManager::PRIORITY_LOW);
},
// Функция для обработки сгруппированных данных
function (BatchGroup $group) {
// ...
},
$id
);
}
class ExampleCacheLifeTime
{
// Функция вида LifeTime - кэширование на время
static public function fnLifeTime(int $x): BatchPromise
{
return BatchManager::createEx(function (BatchGroupConfig $groupConfig) {
// Установить тип функции = LifeTime, установить время жизни = 5 минут
$groupConfig->setCacheLifetime(5 * 60);
}, function (BatchGroup $group) {
// Функция получения результата для каждого набора аргументов
$group->setResult(function (int $minValue) {
// Вернуть случайное число от $minValue до 1000
// и кэшировать это значение на 5 минут
return random_int(min($minValue, 1000), 1000);
});
}, $x);
}
}
// Пример функции Get и Put
class ExampleCacheGetPut
{
// Хранение значений
static protected array $data = [];
// Функция вида Get
static public function fnGet(int $x): BatchPromise
{
return BatchManager::createEx(function (BatchGroupConfig $groupConfig) {
// Установить тип функции = Get
$groupConfig->setCacheGet();
}, function (BatchGroup $group) {
// Функция получения результата для каждого набора аргументов
$group->setResult(function (int $x) {
// Читать текущее значение
$ret = self::$data[$x] ?? 0;
// Установить зависимость от функции вида Put
self::fnPut($x, $ret);
// Вернуть результат
return $ret;
});
}, $x);
}
// Функция вида Put
public function fnPut(int $x, int $value): BatchPromise
{
return BatchManager::createEx(function (BatchGroupConfig $groupConfig) {
// Установить тип функции = Put
// Указать список индексов ключевых аргументов
$groupConfig->setCachePut(0);
}, function (BatchGroup $group) {
// Функция получения результата для каждого набора аргументов
$group->setResult(function (int $x, int $value): void {
// Установить значение
self::$data[$x] = $value;
});
}, $x, $value);
}
}