На Framework Foton нет готового инструмента проверки выполнения задачи как например в Laravel, для таких проверок используется встроенных механизм микросервисов который не только проверяет выполнена ли задача, но и условие выполнения задачи, но если вам все таки хочется реализовать такой механизм с помощью очередей в этой статье мы покажем как легко это сделать.
Первое, что нам нужно- это написать метод обработки нашей задачи, там будет вся логика. Сейчас приведем пример такого метода и разберем что он делает по шагам
<?php
//размещаем код в класс Dev\Cron там уже инициирован класс ядра
//метод записи в файл
private function writeFile($path,$step){
if(file_exists($path)){
$current = file_get_contents($path);
}
else{
$current = 0;
}
$current+=$step;
file_put_contents($path,$current);
}
//метод чтения файла
private function readFile($path){
if(file_exists($path)){
return file_get_contents($path);
}
return 0;
}
//метод удаления файла
private function deleteFile($path){
if(file_exists($path)){
unlink($path);
}
}
public function task($text){
//настройки, путь к файлу для хранения количество успешно обработанных операций
$path = FotonGit('.logs/task.log');
//количество успешных шагов, после которого нужно удалить задачу
$maxCount = 12;
//шаг обновления
$step = 1;
//читаем из файла количество уже отработаных шагов
$count = $this->readFile($path);
//если оно больше или равно заданному максимуму удаляем задачу и файл логирования
if($count>=$maxCount){
$this->core->delWork('task');
$this->deleteFile($path);
echo $this->cli->green("Запись данных остановлена на шаге $count очередь удалена\r\n");
}
//если же нет выполняем задачу и дописываем в файл логов еще один шаг
else{
//здесь логика выполнения задачи
FotonLog($text,'F');
echo $this->cli->green("Данные записаны в файл текущая позиция $count \r\n");
//добавляем при успешном выполнении еще 1,2,3 и т.д. записей в зависимости от $step
$this->writeFile($path,$step);
}
}Теперь остается только инициировать запуск этой очереди в любом месте программу где доступен метод ядра
$this->core->cron(‘task’,[‘тестовый текст’]);