Одним из хороших примеров использования популярной базы данных Mongo для php
программиста, является логирование событий происходящих в скрипте в коллекции базы.
Важным преимуществом логирования в MongoDB перед логированием в файлы является:
1. Возможность отправки в лог целых массивов данных
2. Единая точка хранения логов, не будет больше кучи разбросанных по системе файлов
3. Возможность поиска, сортировки, отбора по условиям документов в коллекциях (документ и коллекция — внутреннее понятие MongoDB)
4. Бесплатный софт для работы с БД
5. Масса библиотек для работы с Mongo для ваших скриптов
6. MongoDB имеет обширную документацию по составлению запросов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/** * Добавление лога в бд Монго * @param array $doc массив данных для записи в бд * @param string $database имя документа в бд монго */ function LogM($doc, $database = 'logs.all') { $doc['dt'] = date('d.m.Y H:i:s'); $doc['dd'] = date('d.m.Y'); $file_lock = '/mongo_error.lock'; $file_log = '/mongo_error_log.txt'; $timeFile = 0; //Время создания файла блокировки $timeCorectir = 3601; //время протухания файла блокировки if (file_exists($file_lock)) { $timeFile = filemtime($file_lock); } try { $mng = new MongoDB\Driver\Manager("mongodb://localhost:27017", array('connectTimeoutMS' => 500, 'socketCheckIntervalMS' => 1000, 'serverSelectionTimeoutMS' => 500)); $bulk = new MongoDB\Driver\BulkWrite; if (isset($doc['uuid']) && $doc['uuid']) { $doc['_id'] = $doc['uuid']; } $bulk->insert($doc); $mng->executeBulkWrite($database, $bulk); } catch (Exception $e) { if (!file_exists($file_lock)) { file_put_contents($file_lock, rand(1, 100)); file_put_contents($file_log, '#### ' . date('d.m.Y H:i:s', time()) . ' ###' . PHP_EOL); file_put_contents($file_log, print_r($e, TRUE), FILE_APPEND); } } finally { if (($timeFile > 0) && (time() > ($timeFile + $timeCorectir)) && file_exists($file_lock)) { unlink($file_lock); } } } |
Пояснение к функции:
$doc — Массив для логирования, по умолчанию в него добавляется ключи dt и dd с дата+время и дата. Удобно в последствии использовать для фильтрации
$database — Название базы данных и через «.» название коллекции. Сюда запишется ваш массив данных, который преобразуется в json структуру данных
1 2 3 |
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017", array('connectTimeoutMS' => 500, 'socketCheckIntervalMS' => 1000, 'serverSelectionTimeoutMS' => 500)); |
Эта строка кода отвечает за подключение к БД. Обратите внимание в текущем подключении подразумевается что бд не требует логина и пароля.
Код функции внутри вынесен в блоки try и catch, для того что бы логирование в случае ошибки не роняло ваш скрипт.
PS: Немного дёгтя — данные передаваемые в массив $doc должны быть в кодировке UTF-8, иначе запись в MongoDB потерпит неудачу