Функция retry
Функция retry предназначена для выполнения замыкания с автоматическим повторением
в случае возникновения исключений. Первым параметром передаётся максимальное количество
попыток, вторым - замыкание, которое нужно выполнить, третьим - задержка в миллисекундах
между попытками, четвёртым - замыкание для обработки исключений.
Синтаксис
<?php
retry($attempts, $callback, $delay = 100, $when = null);
?>
Параметр $attempts задаёт количество попыток выполнения,
параметр $callback - выполняемый код, $delay - задержка
между попытками в миллисекундах, $when - колбэк для обработки исключений.
Пример
Давайте попробуем выполнить запрос к базе данных, который может завершиться ошибкой, и повторим его в случае неудачи:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
class ExampleController extends Controller
{
public function index()
{
$res = retry(3, function () {
return DB::table('users')->where('id', 1)->first();
}, 100);
echo $res->name;
}
}
?>
Результат выполнения кода:
"John Doe"
В данном примере запрос будет выполнен до 3 раз с задержкой 100 мс между попытками в случае возникновения исключения.
Пример
Давайте используем замыкание для обработки исключений и логирования ошибок:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesLog;
class ExampleController extends Controller
{
public function index()
{
$res = retry(5, function () {
$data = file_get_contents('https://api.example.com/data');
if ($data === false) {
throw new \Exception('Failed to fetch data');
}
return json_decode($data, true);
}, 200, function ($exception) {
Log::warning('Attempt failed: ' . $exception->getMessage());
});
echo $res['status'];
}
}
?>
Результат выполнения кода:
"success"
Пример
Давайте используем функцию для повторной попытки отправки email уведомления при сбое:
<?php
namespace AppHttpControllers;
use AppMailWelcomeMail;
use IlluminateSupportFacadesMail;
class NotificationController extends Controller
{
public function sendWelcome($email)
{
$res = retry(3, function () use ($email) {
Mail::to($email)->send(new WelcomeMail());
return "Email sent successfully";
}, 500);
echo $res;
}
}
?>
Результат выполнения кода:
"Email sent successfully"
Функция будет повторять отправку письма до 3 раз с задержкой 500 мс между попытками при возникновении ошибок.