# mysqlnd_qc_get_query_trace_log

(PECL mysqlnd_qc >= 1.0.0)

mysqlnd_qc_get_query_trace_log — Returns a backtrace for each query inspected by the query cache

### Description

mysqlnd_qc_get_query_trace_log ( ) : array

Returns a backtrace for each query inspected by the query cache. The collection of the backtrace is disabled by default. To collect the backtrace you have to set the PHP configuration directive `mysqlnd_qc.collect_query_trace` to `1`

The maximum depth of the backtrace is limited to the depth set with the PHP configuration directive `mysqlnd_qc.query_trace_bt_depth`.

### Parameters

This function has no parameters.

### Return Values

An array of query backtrace. Every list entry contains the query string, a backtrace and further detail information.

Key | Description
--- | ---
`query` | Query string.
`origin` | Code backtrace.
`run_time` | Query run time in milliseconds. The collection of all times and the necessary `gettimeofday` system calls can be disabled by setting the PHP configuration directive `mysqlnd_qc.time_statistics` to `0`
`store_time` | Query result set store time in milliseconds. The collection of all times and the necessary `gettimeofday` system calls can be disabled by setting the PHP configuration directive `mysqlnd_qc.time_statistics` to `0`
`eligible_for_caching` | `TRUE` if query is cacheable otherwise `FALSE`.
`no_table` | `TRUE` if the query has generated a result set and at least one column from the result set has no table name set in its metadata. This is usually the case with queries which one probably do not want to cache such as `SELECT SLEEP(1)`. By default any such query will not be added to the cache. See also PHP configuration directive `mysqlnd_qc.cache_no_table`.
`was_added` | `TRUE` if the query result has been put into the cache, otherwise `FALSE`.
`was_already_in_cache` | `TRUE` if the query result would have been added to the cache if it was not already in the cache (cache hit). Otherwise `FALSE`.

### Examples

Example #1 mysqlnd_qc_get_query_trace_log() example

    mysqlnd_qc.collect_query_trace=1

`<?php
/* Connect, create and populate test table */
$mysqli = new mysqli("host", "user", "password", "schema", "port", "socket");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2)");
/* not cached */
$res = $mysqli->query("SELECT id FROM test WHERE id = 1");
var_dump($res->fetch_assoc());
$res->free();
/* cache put */
$res = $mysqli->query("/*" . MYSQLND_QC_ENABLE_SWITCH . "*/" . "SELECT id FROM test WHERE id = 2");
var_dump($res->fetch_assoc());
$res->free();
/* cache hit */
$res = $mysqli->query("/*" . MYSQLND_QC_ENABLE_SWITCH . "*/" . "SELECT id FROM test WHERE id = 2");
var_dump($res->fetch_assoc());
$res->free();
var_dump(mysqlnd_qc_get_query_trace_log());
?>`

The above examples will output:

    array(1) {
      ["id"]=>
      string(1) "1"
    }
    array(1) {
      ["id"]=>
      string(1) "2"
    }
    array(1) {
      ["id"]=>
      string(1) "2"
    }
    array(6) {
      [0]=>
      array(8) {
        ["query"]=>
        string(25) "DROP TABLE IF EXISTS test"
        ["origin"]=>
        string(102) "#0 qc.php(4): mysqli->query('DROP TABLE IF E...')
    #1 {main}"
        ["run_time"]=>
        int(0)
        ["store_time"]=>
        int(0)
        ["eligible_for_caching"]=>
        bool(false)
        ["no_table"]=>
        bool(false)
        ["was_added"]=>
        bool(false)
        ["was_already_in_cache"]=>
        bool(false)
      }
      [1]=>
      array(8) {
        ["query"]=>
        string(25) "CREATE TABLE test(id INT)"
        ["origin"]=>
        string(102) "#0 qc.php(5): mysqli->query('CREATE TABLE te...')
    #1 {main}"
        ["run_time"]=>
        int(0)
        ["store_time"]=>
        int(0)
        ["eligible_for_caching"]=>
        bool(false)
        ["no_table"]=>
        bool(false)
        ["was_added"]=>
        bool(false)
        ["was_already_in_cache"]=>
        bool(false)
      }
      [2]=>
      array(8) {
        ["query"]=>
        string(36) "INSERT INTO test(id) VALUES (1), (2)"
        ["origin"]=>
        string(102) "#0 qc.php(6): mysqli->query('INSERT INTO tes...')
    #1 {main}"
        ["run_time"]=>
        int(0)
        ["store_time"]=>
        int(0)
        ["eligible_for_caching"]=>
        bool(false)
        ["no_table"]=>
        bool(false)
        ["was_added"]=>
        bool(false)
        ["was_already_in_cache"]=>
        bool(false)
      }
      [3]=>
      array(8) {
        ["query"]=>
        string(32) "SELECT id FROM test WHERE id = 1"
        ["origin"]=>
        string(102) "#0 qc.php(9): mysqli->query('SELECT id FROM ...')
    #1 {main}"
        ["run_time"]=>
        int(0)
        ["store_time"]=>
        int(25)
        ["eligible_for_caching"]=>
        bool(false)
        ["no_table"]=>
        bool(false)
        ["was_added"]=>
        bool(false)
        ["was_already_in_cache"]=>
        bool(false)
      }
      [4]=>
      array(8) {
        ["query"]=>
        string(41) "/*qc=on*/SELECT id FROM test WHERE id = 2"
        ["origin"]=>
        string(103) "#0 qc.php(14): mysqli->query('/*qc=on*/SELECT...')
    #1 {main}"
        ["run_time"]=>
        int(311)
        ["store_time"]=>
        int(13)
        ["eligible_for_caching"]=>
        bool(true)
        ["no_table"]=>
        bool(false)
        ["was_added"]=>
        bool(true)
        ["was_already_in_cache"]=>
        bool(false)
      }
      [5]=>
      array(8) {
        ["query"]=>
        string(41) "/*qc=on*/SELECT id FROM test WHERE id = 2"
        ["origin"]=>
        string(103) "#0 qc.php(19): mysqli->query('/*qc=on*/SELECT...')
    #1 {main}"
        ["run_time"]=>
        int(13)
        ["store_time"]=>
        int(8)
        ["eligible_for_caching"]=>
        bool(true)
        ["no_table"]=>
        bool(false)
        ["was_added"]=>
        bool(false)
        ["was_already_in_cache"]=>
        bool(true)
      }
    }

### See Also

- Runtime configuration
- mysqlnd_qc.collect_query_trace
- mysqlnd_qc.query_trace_bt_depth
- mysqlnd_qc.time_statistics
- mysqlnd_qc.cache_no_table
- mysqlnd_qc_get_normalized_query_trace_log() - Returns a normalized query trace log for each query inspected by the query cache