예제 #1
0
파일: C3_clear.php 프로젝트: 4gekkman/M2
 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" => ""];
 }
예제 #2
0
파일: T3_listener.php 프로젝트: 4gekkman/M2
 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);
     }
 }
예제 #3
0
 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" => ""];
 }