1--TEST-- 2mysqli_debug() - mysqlnd only control strings 3--EXTENSIONS-- 4mysqli 5--SKIPIF-- 6<?php 7require_once('skipifconnectfailure.inc'); 8require_once('connect.inc'); 9 10if (!function_exists('mysqli_debug')) 11 die("skip mysqli_debug() not available"); 12 13if (!defined('MYSQLI_DEBUG_TRACE_ENABLED')) 14 die("skip: can't say for sure if mysqli_debug works"); 15 16if (defined('MYSQLI_DEBUG_TRACE_ENABLED') && !MYSQLI_DEBUG_TRACE_ENABLED) 17 die("skip: debug functionality not enabled"); 18 19if (!$IS_MYSQLND) 20 die("skip mysqlnd only test"); 21?> 22--FILE-- 23<?php 24 require_once('connect.inc'); 25 require_once('table.inc'); 26 27 function try_control_string($link, $control_string, $trace_file, $offset) { 28 29 @unlink($trace_file); 30 if (true !== ($tmp = @mysqli_debug($control_string))) { 31 printf("[%03d][control string '%s'] Expecting boolean/true, got %s/%s.\n", 32 $offset + 1, 33 $control_string, 34 gettype($tmp), 35 $tmp); 36 return false; 37 } 38 39 if (!$res = mysqli_query($link, 'SELECT * FROM test')) { 40 printf("[%03d][control string '%s'] [%d] %s.\n", 41 $offset + 2, 42 $control_string, 43 mysqli_errno($link), 44 mysqli_error($link)); 45 return false; 46 } 47 while ($row = mysqli_fetch_assoc($res)) 48 ; 49 mysqli_free_result($res); 50 51 clearstatcache(); 52 if (!file_exists($trace_file)) { 53 printf("[%03d][control string '%s'] Trace file has not been written.\n", 54 $offset + 3, 55 $control_string, 56 gettype($tmp), 57 $tmp); 58 return false; 59 } 60 61 return trim(substr(file_get_contents($trace_file), 0, 100024)); 62 } 63 64 $memory_funcs = array( 65 '_mysqlnd_ecalloc', 66 '_mysqlnd_emalloc', 67 '_mysqlnd_palloc_free_thd_cache_reference', 68 '_mysqlnd_pecalloc', 69 '_mysqlnd_pefree', 70 '_mysqlnd_pemalloc', 71 '_mysqlnd_perealloc', 72 ); 73 $trace_file = sprintf('%s%s%s', sys_get_temp_dir(), DIRECTORY_SEPARATOR, 'mysqli_debug_phpt.trace'); 74 75 $trace = try_control_string($link, 't:m:O,' . $trace_file, $trace_file, 10); 76 if (!strstr($trace, 'SELECT * FROM test') && !strstr($trace, 'mysql_real_query')) 77 printf("[015] SELECT query cannot be found in trace. Trace contents seems wrong.\n"); 78 79 $lines_trace = explode("\n", $trace); 80 $functions_trace = array(); 81 foreach ($lines_trace as $k => $line) { 82 $line = trim($line); 83 if (preg_match("@^[|\s]*>([\w:]+)@ism", $line, $matches)) { 84 $functions_trace[$matches[1]] = $matches[1]; 85 } 86 } 87 88 $found = 0; 89 foreach ($memory_funcs as $k => $name) 90 if (isset($functions_trace[$name])) 91 $found++; 92 93 if ($found < 1) { 94 printf("[016] Only %d memory functions have been found, expecting at least %d.\n", 95 $found, 1); 96 var_dump($trace); 97 } 98 99 $trace = try_control_string($link, 't:O,' . $trace_file, $trace_file, 20); 100 if (!strstr($trace, 'SELECT * FROM test') && !strstr($trace, 'mysql_real_query')) 101 printf("[025] SELECT query cannot be found in trace. Trace contents seems wrong.\n"); 102 103 $lines_trace = explode("\n", $trace); 104 $functions_trace = array(); 105 foreach ($lines_trace as $k => $line) { 106 $line = trim($line); 107 if (preg_match("@^[|\s]*>([\w:]+)@ism", $line, $matches)) { 108 $functions_trace[$matches[1]] = $matches[1]; 109 } 110 } 111 112 $found = 0; 113 foreach ($memory_funcs as $k => $name) 114 if (isset($functions_trace[$name])) 115 $found++; 116 117 if ($found > 2) { 118 printf("[026] More than %d memory functions have been recorded, that's strange.\n", 119 $found); 120 var_dump($trace); 121 } 122 123 mysqli_close($link); 124 @unlink($trace_file); 125 print "done!"; 126?> 127--CLEAN-- 128<?php 129 require_once("clean_table.inc"); 130?> 131--EXPECT-- 132done! 133