Как получить доступ к профилю MongoDB в PHP?

Я пытаюсь получить доступ к профилировщику MongoDB на PHP с тем же запросом, который я бы использовал в клиенте mongo:

$db = $mongo->selectDB('myapp_db'); $array = $db->execute('return db.system.profile.find();'); echo '<pre>' . print_r($array, true); 

Но я понимаю:

 Array ( [retval] => Array ( [value] => DBQuery: myapp_db.system.profile -> undefined ) [ok] => 1 ) 

Профилирование включено и отлично работает в клиенте.

Метод MongoDB :: setProfilingLevel – устанавливает уровень профилирования этой базы данных

 <?php $dbname = 'students'; $mongo = (new MongoClient()); $db = $mongo->$dbname; # 0 (off), 1 (queries > 100ms), and 2 (all queries) $db->setProfilingLevel(2); # … # Some queries # … $response = $db->system->profile->find(); foreach ($response as $query) { print_r($query); } 

Также:

  • Метод MongoDB :: getProfilingLevel – возвращает уровень профилирования этой базы данных
  • Метод MongoCursor :: explain – возвращает объяснение запроса, часто полезно для оптимизации и отладки

Нет необходимости выполнять запрос в JavaScript, который блокирует сервер / базу данных, когда вы можете использовать сам PHP:

 $mongo = new MongoClient(); // Alternatively, use selectCollection from $mongo->myapp_db $collection = $mongo->selectCollection('myapp_db', 'system.profile'); foreach ($collection->find() as $document) { print_r($document); } 

Это обеспечивает более эффективное использование памяти, поскольку вы можете выполнять итерацию результатов вместо получения всего ответа MongoDB :: execute () в одном массиве.

Кроме того, ваш исходный код возвращает курсор (объект DBQuery) из JavaScript. Чтобы обеспечить совместимость с другими драйверами, вы должны вызвать cursor.toArray () перед возвратом. Это обсуждается в ответе Саммай на аналогичный вопрос.