public function handle() { /** * Оглавление * * 1. Полностью очистить pivot-таблицу * 2. Полностью очистить таблицу лога * 3. Сбросить счётчик автоинкремента * * N. Вернуть статус 0 * */ //------------------------// // Полностью очистить лог // //------------------------// $res = call_user_func(function () { try { DB::beginTransaction(); // 1. Полностью очистить pivot-таблицу DB::table('m2.md1000')->truncate(); // 2. Полностью очистить таблицу лога \M2\Models\MD1_log::query()->delete(); // 3. Сбросить счётчик автоинкремента DB::statement('ALTER TABLE m2.md1_log AUTO_INCREMENT = 1;'); DB::commit(); } catch (\Exception $e) { $errortext = 'Invoking of command C3_clear from M-package M2 have ended with error: ' . $e->getMessage(); DB::rollback(); Log::info($errortext); write2log($errortext, ['M2', 'C3_clear']); return ["status" => -2, "data" => $errortext]; } }); if (!empty($res)) { return $res; } //---------------------// // N. Вернуть статус 0 // //---------------------// return ["status" => 0, "data" => ""]; }
public function handle() { /** * Оглавление * * 1. Принять аргументы * 2. Сообщить о запуске демона * 3. Запустить listener * */ // 1. Принять аргументы // 1.1. Принять $sleeptime = $this->argument('sleeptime'); // 1.2. Провести валидацию if (!preg_match("/^[0-9]+\$/ui", $sleeptime)) { $this->error("Sleeptime must be a number."); return; } // 2. Очистить лог $this->info('Очищаю лог...'); Artisan::call('m2:clear'); // 3. Запустить listener $this->info('Начинаю слушать все записи в лог в realtime...'); $timestamp = 0; while (1) { // 1] Получить все записи из лога, у которых created_at > $timestamp, но не более 100 $news = \M2\Models\MD1_log::where('created_at', '>', $timestamp)->limit(100)->get(); // 2] Вывести все $new записи в терминал foreach ($news->toArray() as $new) { $this->comment('[' . $new['created_at'] . '] ' . $new['message']); } // 3] Сохранить дату и время последней записи в $news if ($news->count() != 0) { $timestamp = $news->last()->created_at; } // 4] Подождать $sleeptime секунд sleep($sleeptime); } }
public function handle() { /** * Оглавление * * 1. Проверить, существует ли файл с настройками пакета M2 * 2. Получить настройки ограничений из конфига * 3. Провести валидацию настроек ограничений * * N. Вернуть статус 0 * */ //-----------------------------------------------------------------------------// // Применить заданные в настройках ограничения на объем хранимых в логе данных // //-----------------------------------------------------------------------------// $res = call_user_func(function () { try { DB::beginTransaction(); // 1. Проверить, существует ли файл с настройками пакета M2 if (!file_exists(base_path('config/M2.php'))) { throw new \Exception('Config of package M2 has not been published'); } // 2. Получить настройки ограничений из конфига $limit_type = config('M2.limit_type'); $limit_max_storetime_days = config('M2.limit_max_storetime_days'); $limit_max_count = config('M2.limit_max_count'); // 3. Провести валидацию настроек ограничений // 3.1. $limit_type if (!preg_match("/^[123]{1}\$/ui", $limit_type)) { throw new \Exception("Limit type value must be 1, 2 or 3"); } // 3.2. $limit_max_storetime_days if (!preg_match("/^[0-9]+\$/ui", $limit_max_storetime_days)) { throw new \Exception("The time limit must be a number"); } if ($limit_max_storetime_days >= 1825) { throw new \Exception("The time limit must be equal or less than 1825 (5 years)"); } // 3.3. $limit_max_count if (!preg_match("/^[0-9]+\$/ui", $limit_max_count)) { throw new \Exception("The count limit must be a number"); } if ($limit_max_count <= 1825) { throw new \Exception("The count limit must be equal or less than 1000000 of records"); } // 3.4. Если выбран тип лимитирования №1 // - По времени, и по количеству записей if ($limit_type == 1) { // 1] Удалить из лога все записи старше $limit_max_storetime_days дней // - Перебирать записи лога кусками по 500 штук, и делать дело. \M2\Models\MD1_log::chunk(500, function ($lognotes) use($limit_max_storetime_days) { foreach ($lognotes as $note) { if (+((time() - strtotime($note->created_at)) / 60 / 60) > +$limit_max_storetime_days) { // Удалить все связи записи $note с тегами из pivot-таблицы $note->tags()->detach(); // Удалить $note из Бд $note->delete(); } } }); // 2] Удалить из начала лога (самые старые) все записи, свыше $limit_max_count штук // - Перебирать записи лога кусками по 500 штук, и делать дело. if (+\M2\Models\MD1_log::count() > +$limit_max_count) { // 2.1] Определить кол-во элементов, которые требуется удалить $count2del = +\M2\Models\MD1_log::count() - +$limit_max_count; // 2.2] Удалить из лога $count2del самых старых записей // Получить коллекцию записей, которые требуется удалить $notes2del = \M2\Models\MD1_log::orderBy('created_at')->take($count2del)->get(); // Пробежатсья по $notes2del foreach ($notes2del as $note) { // Удалить все связи записи $note с тегами из pivot-таблицы $note->tags()->detach(); // Удалить $note из Бд $note->delete(); } } } // 3.5. Если выбран тип лимитирования №2 // - По времени if ($limit_type == 2) { // 1] Удалить из лога все записи старше $limit_max_storetime_days дней // - Перебирать записи лога кусками по 500 штук, и делать дело. \M2\Models\MD1_log::chunk(500, function ($lognotes) use($limit_max_storetime_days) { foreach ($lognotes as $note) { if (+((time() - strtotime($note->created_at)) / 60 / 60) > +$limit_max_storetime_days) { // Удалить все связи записи $note с тегами из pivot-таблицы $note->tags()->detach(); // Удалить $note из Бд $note->delete(); } } }); } // 3.6. Если выбран тип лимитирования №3 // - По количеству записей if ($limit_type == 3) { // 1] Удалить из начала лога (самые старые) все записи, свыше $limit_max_count штук // - Перебирать записи лога кусками по 500 штук, и делать дело. if (+\M2\Models\MD1_log::count() > +$limit_max_count) { // 1.1] Определить кол-во элементов, которые требуется удалить $count2del = +\M2\Models\MD1_log::count() - +$limit_max_count; // 1.2] Удалить из лога $count2del самых старых записей // Получить коллекцию записей, которые требуется удалить $notes2del = \M2\Models\MD1_log::orderBy('created_at')->take($count2del)->get(); // Пробежатсья по $notes2del foreach ($notes2del as $note) { // Удалить все связи записи $note с тегами из pivot-таблицы $note->tags()->detach(); // Удалить $note из Бд $note->delete(); } } } DB::commit(); } catch (\Exception $e) { $errortext = 'Invoking of command C2_limitator from M-package M2 have ended with error: ' . $e->getMessage(); DB::rollback(); Log::info($errortext); write2log($errortext, ['C2_limitator']); return ["status" => -2, "data" => $errortext]; } }); if (!empty($res)) { return $res; } //---------------------// // N. Вернуть статус 0 // //---------------------// return ["status" => 0, "data" => ""]; }