3 V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
4 Released under both BSD license and Lesser GPL library license.
5 Whenever there is any discrepancy between the two licenses,
6 the BSD license will take precedence. See License.txt.
7 Set tabs to 4 for best viewing.
9 Latest version is available at http://adodb.sourceforge.net
11 Library for basic performance monitoring and tuning.
13 My apologies if you see code mixed with presentation. The presentation suits
14 my needs. If you want to separate code from presentation, be my guest. Patches
19 if (!defined('ADODB_DIR')) include_once(dirname(__FILE__
).'/adodb.inc.php');
20 include_once(ADODB_DIR
.'/tohtml.inc.php');
22 define( 'ADODB_OPT_HIGH', 2);
23 define( 'ADODB_OPT_LOW', 1);
25 // returns in K the memory of current process, or 0 if not known
26 function adodb_getmem()
28 if (function_exists('memory_get_usage'))
29 return (integer) ((memory_get_usage()+
512)/1024);
33 if ( strncmp(strtoupper(PHP_OS
),'WIN',3)==0) {
36 exec('tasklist /FI "PID eq ' . $pid. '" /FO LIST', $output);
37 return substr($output[5], strpos($output[5], ':') +
1);
41 exec("ps --pid $pid --no-headers -o%mem,size", $output);
42 if (sizeof($output) == 0) return 0;
44 $memarr = explode(' ',$output[0]);
45 if (sizeof($memarr)>=2) return (integer) $memarr[1];
50 // avoids localization problems where , is used instead of .
51 function adodb_round($n,$prec)
53 return number_format($n, $prec, '.', '');
56 /* return microtime value as a float */
57 function adodb_microtime()
61 return (float)$t[1]+
(float)$t[0];
65 function& adodb_log_sql(&$connx,$sql,$inputarr)
67 $perf_table = adodb_perf
::table();
68 $connx->fnExecute
= false;
70 $rs =& $connx->Execute($sql,$inputarr);
73 if (!empty($connx->_logsql
) && (empty($connx->_logsqlErrors
) ||
!$rs)) {
74 global $ADODB_LOG_CONN;
76 if (!empty($ADODB_LOG_CONN)) {
77 $conn = &$ADODB_LOG_CONN;
78 if ($conn->databaseType
!= $connx->databaseType
)
79 $prefix = '/*dbx='.$connx->databaseType
.'*/ ';
87 $conn->_logsql
= false; // disable logsql error simulation
88 $dbT = $conn->databaseType
;
91 $a0 = (float)$a0[1]+
(float)$a0[0];
94 $a1 = (float)$a1[1]+
(float)$a1[0];
99 $errM = $connx->ErrorMsg();
100 $errN = $connx->ErrorNo();
101 $conn->lastInsID
= 0;
102 $tracer = substr('ERROR: '.htmlspecialchars($errM),0,250);
108 $conn->debug
= false;
109 if (!is_object($rs) ||
$rs->dataProvider
== 'empty')
110 $conn->_affected
= $conn->affected_rows(true);
111 $conn->lastInsID
= @$conn->Insert_ID();
114 if (isset($_SERVER['HTTP_HOST'])) {
115 $tracer .= '<br>'.$_SERVER['HTTP_HOST'];
116 if (isset($_SERVER['PHP_SELF'])) $tracer .= $_SERVER['PHP_SELF'];
118 if (isset($_SERVER['PHP_SELF'])) $tracer .= '<br>'.$_SERVER['PHP_SELF'];
119 //$tracer .= (string) adodb_backtrace(false);
121 $tracer = (string) substr($tracer,0,500);
123 if (is_array($inputarr)) {
124 if (is_array(reset($inputarr))) $params = 'Array sizeof='.sizeof($inputarr);
126 // Quote string parameters so we can see them in the
127 // performance stats. This helps spot disabled indexes.
128 $xar_params = $inputarr;
129 foreach ($xar_params as $xar_param_key => $xar_param) {
130 if (gettype($xar_param) == 'string')
131 $xar_params[$xar_param_key] = '"' . $xar_param . '"';
133 $params = implode(', ', $xar_params);
134 if (strlen($params) >= 3000) $params = substr($params, 0, 3000);
140 if (is_array($sql)) $sql = $sql[0];
141 if ($prefix) $sql = $prefix.$sql;
142 $arr = array('b'=>strlen($sql).'.'.crc32($sql),
143 'c'=>substr($sql,0,3900), 'd'=>$params,'e'=>$tracer,'f'=>adodb_round($time,6));
145 $saved = $conn->debug
;
148 $d = $conn->sysTimeStamp
;
149 if (empty($d)) $d = date("'Y-m-d H:i:s'");
150 if ($conn->dataProvider
== 'oci8' && $dbT != 'oci8po') {
151 $isql = "insert into $perf_table values($d,:b,:c,:d,:e,:f)";
152 } else if ($dbT == 'odbc_mssql' ||
$dbT == 'informix' ||
strncmp($dbT,'odbtp',4)==0) {
154 if ($dbT == 'informix') $sql2 = substr($sql2,0,230);
156 $sql1 = $conn->qstr($arr['b']);
157 $sql2 = $conn->qstr($arr['c']);
158 $params = $conn->qstr($arr['d']);
159 $tracer = $conn->qstr($arr['e']);
161 $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values($d,$sql1,$sql2,$params,$tracer,$timer)";
162 if ($dbT == 'informix') $isql = str_replace(chr(10),' ',$isql);
165 if ($dbT == 'db2') $arr['f'] = (float) $arr['f'];
166 $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values( $d,?,?,?,?,?)";
168 $ok = $conn->Execute($isql,$arr);
169 $conn->debug
= $saved;
172 $conn->_logsql
= true;
174 $err2 = $conn->ErrorMsg();
175 $conn->_logsql
= true; // enable logsql error simulation
176 $perf =& NewPerfMonitor($conn);
178 if ($perf->CreateLogTable()) $ok = $conn->Execute($isql,$arr);
180 $ok = $conn->Execute("create table $perf_table (
184 params varchar(3000),
186 timer decimal(16,6))");
189 ADOConnection
::outp( "<p><b>LOGSQL Insert Failed</b>: $isql<br>$err2</p>");
190 $conn->_logsql
= false;
193 $connx->_errorMsg
= $errM;
194 $connx->_errorCode
= $errN;
196 $connx->fnExecute
= 'adodb_log_sql';
202 The settings data structure is an associative array that database parameter per element.
204 Each database parameter element in the array is itself an array consisting of:
206 0: category code, used to group related db parameters
208 a. sql string to retrieve value, eg. "select value from v\$parameter where name='db_block_size'",
209 b. array holding sql string and field to look for, e.g. array('show variables','table_cache'),
210 c. a string prefixed by =, then a PHP method of the class is invoked,
211 e.g. to invoke $this->GetIndexValue(), set this array element to '=GetIndexValue',
212 2: description of the database parameter
217 var $color = '#F0F0F0';
218 var $table = '<table border=1 bgcolor=white>';
219 var $titles = '<tr><td><b>Parameter</b></td><td><b>Value</b></td><td><b>Description</b></td></tr>';
221 var $tablesSQL = false;
222 var $cliFormat = "%32s => %s \r\n";
223 var $sql1 = 'sql1'; // used for casting sql1 to text for mssql
225 var $helpurl = "<a href=http://phplens.com/adodb/reference.functions.fnexecute.and.fncacheexecute.properties.html#logsql>LogSQL help</a>";
226 var $createTableSQL = false;
227 var $maxLength = 2000;
229 // Sets the tablename to be used
230 function table($newtable = false)
234 if (!empty($newtable)) $_table = $newtable;
235 if (empty($_table)) $_table = 'adodb_logsql';
239 // returns array with info to calculate CPU Load
244 cpu 524152 2662 2515228 336057010
245 cpu0 264339 1408 1257951 168025827
246 cpu1 259813 1254 1257277 168031181
249 intr 890153570 868093576 6 0 4 4 0 6 1 2 0 0 0 124 0 8098760 2 13961053 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
250 disk_io: (3,0):(3144904,54369,610378,3090535,50936192) (3,1):(3630212,54097,633016,3576115,50951320)
256 // Algorithm is taken from
257 // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/example__obtaining_raw_performance_data.asp
258 if (strncmp(PHP_OS
,'WIN',3)==0) {
259 if (PHP_VERSION
== '5.0.0') return false;
260 if (PHP_VERSION
== '5.0.1') return false;
261 if (PHP_VERSION
== '5.0.2') return false;
262 if (PHP_VERSION
== '5.0.3') return false;
263 if (PHP_VERSION
== '4.3.10') return false; # see http://bugs.php.net/bug.php?id=31737
265 @$c = new COM("WinMgmts:{impersonationLevel=impersonate}!Win32_PerfRawData_PerfOS_Processor.Name='_Total'");
266 if (!$c) return false;
268 $info[0] = $c->PercentProcessorTime
;
271 $info[3] = $c->TimeStamp_Sys100NS
;
276 // Algorithm - Steve Blinch (BlitzAffe Online, http://www.blitzaffe.com)
277 $statfile = '/proc/stat';
278 if (!file_exists($statfile)) return false;
280 $fd = fopen($statfile,"r");
281 if (!$fd) return false;
283 $statinfo = explode("\n",fgets($fd, 1024));
285 foreach($statinfo as $line) {
286 $info = explode(" ",$line);
287 if($info[0]=="cpu") {
288 array_shift($info); // pop off "cpu"
289 if(!$info[0]) array_shift($info); // pop off blank space (if any)
298 /* NOT IMPLEMENTED */
303 total: used: free: shared: buffers: cached:
304 Mem: 1055289344 917299200 137990144 0 165437440 599773184
305 Swap: 2146775040 11055104 2135719936
313 Inact_dirty: 322856 kB
314 Inact_clean: 24256 kB
315 Inact_target: 168316 kB
320 SwapTotal: 2096460 kB
322 Committed_AS: 348732 kB
328 Remember that this is client load, not db server load!
333 $info = $this->_CPULoad();
334 if (!$info) return false;
336 if (empty($this->_lastLoad
)) {
338 $this->_lastLoad
= $info;
339 $info = $this->_CPULoad();
342 $last = $this->_lastLoad
;
343 $this->_lastLoad
= $info;
345 $d_user = $info[0] - $last[0];
346 $d_nice = $info[1] - $last[1];
347 $d_system = $info[2] - $last[2];
348 $d_idle = $info[3] - $last[3];
350 //printf("Delta - User: %f Nice: %f System: %f Idle: %f<br>",$d_user,$d_nice,$d_system,$d_idle);
352 if (strncmp(PHP_OS
,'WIN',3)==0) {
353 if ($d_idle < 1) $d_idle = 1;
354 return 100*(1-$d_user/$d_idle);
356 $total=$d_user+
$d_nice+
$d_system+
$d_idle;
357 if ($total<1) $total=1;
358 return 100*($d_user+
$d_nice+
$d_system)/$total;
362 function Tracer($sql)
364 $perf_table = adodb_perf
::table();
365 $saveE = $this->conn
->fnExecute
;
366 $this->conn
->fnExecute
= false;
368 global $ADODB_FETCH_MODE;
369 $save = $ADODB_FETCH_MODE;
370 $ADODB_FETCH_MODE = ADODB_FETCH_NUM
;
371 if ($this->conn
->fetchMode
!== false) $savem = $this->conn
->SetFetchMode(false);
373 $sqlq = $this->conn
->qstr($sql);
374 $arr = $this->conn
->GetArray(
375 "select count(*),tracer
376 from $perf_table where sql1=$sqlq
381 $s .= '<h3>Scripts Affected</h3>';
382 foreach($arr as $k) {
383 $s .= sprintf("%4d",$k[0]).' '.strip_tags($k[1]).'<br>';
387 if (isset($savem)) $this->conn
->SetFetchMode($savem);
388 $ADODB_CACHE_MODE = $save;
389 $this->conn
->fnExecute
= $saveE;
394 Explain Plan for $sql.
395 If only a snippet of the $sql is passed in, then $partial will hold the crc32 of the
398 function Explain($sql,$partial=false)
403 function InvalidSQL($numsql = 10)
406 if (isset($_GET['sql'])) return;
407 $s = '<h3>Invalid SQL</h3>';
408 $saveE = $this->conn
->fnExecute
;
409 $this->conn
->fnExecute
= false;
410 $perf_table = adodb_perf
::table();
411 $rs =& $this->conn
->SelectLimit("select distinct count(*),sql1,tracer as error_msg from $perf_table where tracer like 'ERROR:%' group by sql1,tracer order by 1 desc",$numsql);//,$numsql);
412 $this->conn
->fnExecute
= $saveE;
414 $s .= rs2html($rs,false,false,false,false);
416 return "<p>$this->helpurl. ".$this->conn
->ErrorMsg()."</p>";
423 This script identifies the longest running SQL
425 function _SuspiciousSQL($numsql = 10)
427 global $ADODB_FETCH_MODE;
429 $perf_table = adodb_perf
::table();
430 $saveE = $this->conn
->fnExecute
;
431 $this->conn
->fnExecute
= false;
433 if (isset($_GET['exps']) && isset($_GET['sql'])) {
434 $partial = !empty($_GET['part']);
435 echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n";
438 if (isset($_GET['sql'])) return;
441 $save = $ADODB_FETCH_MODE;
442 $ADODB_FETCH_MODE = ADODB_FETCH_NUM
;
443 if ($this->conn
->fetchMode
!== false) $savem = $this->conn
->SetFetchMode(false);
444 //$this->conn->debug=1;
445 $rs =& $this->conn
->SelectLimit(
446 "select avg(timer) as avg_timer,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer
448 where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT')
449 and (tracer is null or tracer not like 'ERROR:%')
451 order by 1 desc",$numsql);
452 if (isset($savem)) $this->conn
->SetFetchMode($savem);
453 $ADODB_FETCH_MODE = $save;
454 $this->conn
->fnExecute
= $saveE;
456 if (!$rs) return "<p>$this->helpurl. ".$this->conn
->ErrorMsg()."</p>";
457 $s = "<h3>Suspicious SQL</h3>
458 <font size=1>The following SQL have high average execution times</font><br>
459 <table border=1 bgcolor=white><tr><td><b>Avg Time</b><td><b>Count</b><td><b>SQL</b><td><b>Max</b><td><b>Min</b></tr>\n";
460 $max = $this->maxLength
;
462 $sql = $rs->fields
[1];
463 $raw = urlencode($sql);
464 if (strlen($raw)>$max-100) {
465 $sql2 = substr($sql,0,$max-500);
466 $raw = urlencode($sql2).'&part='.crc32($sql);
468 $prefix = "<a target=sql".rand()." href=\"?hidem=1&exps=1&sql=".$raw."&x#explain\">";
470 if ($this->explain
== false ||
strlen($prefix)>$max) {
471 $suffix = ' ... <i>String too long for GET parameter: '.strlen($prefix).'</i>';
474 $s .= "<tr><td>".adodb_round($rs->fields
[0],6)."<td align=right>".$rs->fields
[2]."<td><font size=-1>".$prefix.htmlspecialchars($sql).$suffix."</font>".
475 "<td>".$rs->fields
[3]."<td>".$rs->fields
[4]."</tr>";
478 return $s."</table>";
482 function CheckMemory()
488 function SuspiciousSQL($numsql=10)
490 return adodb_perf
::_SuspiciousSQL($numsql);
493 function ExpensiveSQL($numsql=10)
495 return adodb_perf
::_ExpensiveSQL($numsql);
500 This reports the percentage of load on the instance due to the most
501 expensive few SQL statements. Tuning these statements can often
502 make huge improvements in overall system performance.
504 function _ExpensiveSQL($numsql = 10)
506 global $ADODB_FETCH_MODE;
508 $perf_table = adodb_perf
::table();
509 $saveE = $this->conn
->fnExecute
;
510 $this->conn
->fnExecute
= false;
512 if (isset($_GET['expe']) && isset($_GET['sql'])) {
513 $partial = !empty($_GET['part']);
514 echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n";
517 if (isset($_GET['sql'])) return;
520 $save = $ADODB_FETCH_MODE;
521 $ADODB_FETCH_MODE = ADODB_FETCH_NUM
;
522 if ($this->conn
->fetchMode
!== false) $savem = $this->conn
->SetFetchMode(false);
524 $rs =& $this->conn
->SelectLimit(
525 "select sum(timer) as total,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer
527 where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT')
528 and (tracer is null or tracer not like 'ERROR:%')
531 order by 1 desc",$numsql);
532 if (isset($savem)) $this->conn
->SetFetchMode($savem);
533 $this->conn
->fnExecute
= $saveE;
534 $ADODB_FETCH_MODE = $save;
535 if (!$rs) return "<p>$this->helpurl. ".$this->conn
->ErrorMsg()."</p>";
536 $s = "<h3>Expensive SQL</h3>
537 <font size=1>Tuning the following SQL could reduce the server load substantially</font><br>
538 <table border=1 bgcolor=white><tr><td><b>Load</b><td><b>Count</b><td><b>SQL</b><td><b>Max</b><td><b>Min</b></tr>\n";
539 $max = $this->maxLength
;
541 $sql = $rs->fields
[1];
542 $raw = urlencode($sql);
543 if (strlen($raw)>$max-100) {
544 $sql2 = substr($sql,0,$max-500);
545 $raw = urlencode($sql2).'&part='.crc32($sql);
547 $prefix = "<a target=sqle".rand()." href=\"?hidem=1&expe=1&sql=".$raw."&x#explain\">";
549 if($this->explain
== false ||
strlen($prefix>$max)) {
553 $s .= "<tr><td>".adodb_round($rs->fields
[0],6)."<td align=right>".$rs->fields
[2]."<td><font size=-1>".$prefix.htmlspecialchars($sql).$suffix."</font>".
554 "<td>".$rs->fields
[3]."<td>".$rs->fields
[4]."</tr>";
557 return $s."</table>";
561 Raw function to return parameter value from $settings.
563 function DBParameter($param)
565 if (empty($this->settings
[$param])) return false;
566 $sql = $this->settings
[$param][1];
567 return $this->_DBParameter($sql);
571 Raw function returning array of poll paramters
573 function &PollParameters()
575 $arr[0] = (float)$this->DBParameter('data cache hit ratio');
576 $arr[1] = (float)$this->DBParameter('data reads');
577 $arr[2] = (float)$this->DBParameter('data writes');
578 $arr[3] = (integer) $this->DBParameter('current connections');
583 Low-level Get Database Parameter
585 function _DBParameter($sql)
587 $savelog = $this->conn
->LogSQL(false);
588 if (is_array($sql)) {
589 global $ADODB_FETCH_MODE;
593 if (sizeof($sql)>2) $pos = $sql[2];
595 if (sizeof($sql)>3) $coef = $sql[3];
598 $save = $ADODB_FETCH_MODE;
599 $ADODB_FETCH_MODE = ADODB_FETCH_NUM
;
600 if ($this->conn
->fetchMode
!== false) $savem = $this->conn
->SetFetchMode(false);
602 $rs = $this->conn
->Execute($sql1);
604 if (isset($savem)) $this->conn
->SetFetchMode($savem);
605 $ADODB_FETCH_MODE = $save;
608 $keyf = reset($rs->fields
);
609 if (trim($keyf) == $key) {
610 $ret = $rs->fields
[$pos];
611 if ($coef) $ret *= $coef;
618 $this->conn
->LogSQL($savelog);
621 if (strncmp($sql,'=',1) == 0) {
622 $fn = substr($sql,1);
625 $sql = str_replace('$DATABASE',$this->conn
->database
,$sql);
626 $ret = $this->conn
->GetOne($sql);
627 $this->conn
->LogSQL($savelog);
634 Warn if cache ratio falls below threshold. Displayed in "Description" column.
636 function WarnCacheRatio($val)
638 if ($val < $this->warnRatio
)
639 return '<font color=red><b>Cache ratio should be at least '.$this->warnRatio
.'%</b></font>';
643 /***********************************************************************************************/
644 // HIGH LEVEL UI FUNCTIONS
645 /***********************************************************************************************/
648 function UI($pollsecs=5)
651 $perf_table = adodb_perf
::table();
655 if ($conn->host
&& $conn->database
) $app .= ', db=';
656 $app .= $conn->database
;
658 if ($app) $app .= ', ';
659 $savelog = $this->conn
->LogSQL(false);
660 $info = $conn->ServerInfo();
661 if (isset($_GET['clearsql'])) {
662 $this->conn
->Execute("delete from $perf_table");
664 $this->conn
->LogSQL($savelog);
668 if (isset($_GET['sql']) && get_magic_quotes_gpc()) {
669 $_GET['sql'] = $_GET['sql'] = str_replace(array("\\'",'\"'),array("'",'"'),$_GET['sql']);
672 if (!isset($_SESSION['ADODB_PERF_SQL'])) $nsql = $_SESSION['ADODB_PERF_SQL'] = 10;
673 else $nsql = $_SESSION['ADODB_PERF_SQL'];
675 $app .= $info['description'];
678 if (isset($_GET['do'])) $do = $_GET['do'];
679 else if (isset($_POST['do'])) $do = $_POST['do'];
680 else if (isset($_GET['sql'])) $do = 'viewsql';
683 if (isset($_GET['nsql'])) {
684 if ($_GET['nsql'] > 0) $nsql = $_SESSION['ADODB_PERF_SQL'] = (integer) $_GET['nsql'];
686 echo "<title>ADOdb Performance Monitor on $app</title><body bgcolor=white>";
687 if ($do == 'viewsql') $form = "<td><form># SQL:<input type=hidden value=viewsql name=do> <input type=text size=4 name=nsql value=$nsql><input type=submit value=Go></td></form>";
688 else $form = "<td> </td>";
690 $allowsql = !defined('ADODB_PERF_NO_RUN_SQL');
692 if (empty($_GET['hidem']))
693 echo "<table border=1 width=100% bgcolor=lightyellow><tr><td colspan=2>
694 <b><a href=http://adodb.sourceforge.net/?perf=1>ADOdb</a> Performance Monitor</b> <font size=1>for $app</font></tr><tr><td>
695 <a href=?do=stats><b>Performance Stats</b></a> <a href=?do=viewsql><b>View SQL</b></a>
696 <a href=?do=tables><b>View Tables</b></a> <a href=?do=poll><b>Poll Stats</b></a>",
697 $allowsql ?
' <a href=?do=dosql><b>Run SQL</b></a>' : '',
705 echo $this->HealthCheck();
706 //$this->conn->debug=1;
707 echo $this->CheckMemory();
710 echo "<iframe width=720 height=80%
711 src=\"{$_SERVER['PHP_SELF']}?do=poll2&hidem=1\"></iframe>";
715 $this->Poll($pollsecs);
719 if (!$allowsql) break;
724 if (empty($_GET['hidem']))
725 echo " <a href=\"?do=viewsql&clearsql=1\">Clear SQL Log</a><br>";
726 echo($this->SuspiciousSQL($nsql));
727 echo($this->ExpensiveSQL($nsql));
728 echo($this->InvalidSQL($nsql));
731 echo $this->Tables(); break;
734 echo "<p><div align=center><font size=1>$ADODB_vers Sponsored by <a href=http://phplens.com/>phpLens</a></font></div>";
738 Runs in infinite loop, returning real-time statistics
740 function Poll($secs=5)
742 $this->conn
->fnExecute
= false;
743 //$this->conn->debug=1;
744 if ($secs <= 1) $secs = 1;
745 echo "Accumulating statistics, every $secs seconds...\n";flush();
746 $arro =& $this->PollParameters();
752 $arr =& $this->PollParameters();
754 $hits = sprintf('%2.2f',$arr[0]);
755 $reads = sprintf('%12.4f',($arr[1]-$arro[1])/$secs);
756 $writes = sprintf('%12.4f',($arr[2]-$arro[2])/$secs);
757 $sess = sprintf('%5d',$arr[3]);
759 $load = $this->CPULoad();
760 if ($load !== false) {
761 $oslabel = 'WS-CPU%';
762 $osval = sprintf(" %2.1f ",(float) $load);
767 if ($cnt %
10 == 0) echo " Time ".$oslabel." Hit% Sess Reads/s Writes/s\n";
769 echo date('H:i:s').' '.$osval."$hits $sess $reads $writes\n";
772 if (connection_aborted()) return;
780 Returns basic health check in a command line interface
782 function HealthCheckCLI()
784 return $this->HealthCheck(true);
789 Returns basic health check as HTML
791 function HealthCheck($cli=false)
793 $saveE = $this->conn
->fnExecute
;
794 $this->conn
->fnExecute
= false;
795 if ($cli) $html = '';
796 else $html = $this->table
.'<tr><td colspan=3><h3>'.$this->conn
->databaseType
.'</h3></td></tr>'.$this->titles
;
800 foreach($this->settings
as $name => $arr) {
801 if ($arr === false) break;
803 if (!is_string($name)) {
804 if ($cli) $html .= " -- $arr -- \n";
805 else $html .= "<tr bgcolor=$this->color><td colspan=3><i>$arr</i> </td></tr>";
809 if (!is_array($arr)) break;
812 if (sizeof($arr)>2) $desc = $arr[2];
813 else $desc = ' ';
816 if ($category == 'HIDE') continue;
818 $val = $this->_DBParameter($how);
820 if ($desc && strncmp($desc,"=",1) === 0) {
821 $fn = substr($desc,1);
822 $desc = $this->$fn($val);
825 if ($val === false) {
826 $m = $this->conn
->ErrorMsg();
829 if (is_numeric($val) && $val >= 256*1024) {
830 if ($val %
(1024*1024) == 0) {
833 } else if ($val %
1024 == 0) {
837 //$val = htmlspecialchars($val);
840 if ($category != $oldc) {
842 //$bgc = ($bgc == ' bgcolor='.$this->color) ? ' bgcolor=white' : ' bgcolor='.$this->color;
844 if (strlen($desc)==0) $desc = ' ';
845 if (strlen($val)==0) $val = ' ';
847 $html .= str_replace(' ','',sprintf($this->cliFormat
,strip_tags($name),strip_tags($val),strip_tags($desc)));
850 $html .= "<tr$bgc><td>".$name.'</td><td>'.$val.'</td><td>'.$desc."</td></tr>\n";
854 if (!$cli) $html .= "</table>\n";
855 $this->conn
->fnExecute
= $saveE;
860 function Tables($orderby='1')
862 if (!$this->tablesSQL
) return false;
864 $savelog = $this->conn
->LogSQL(false);
865 $rs = $this->conn
->Execute($this->tablesSQL
.' order by '.$orderby);
866 $this->conn
->LogSQL($savelog);
867 $html = rs2html($rs,false,false,false,false);
872 function CreateLogTable()
874 if (!$this->createTableSQL
) return false;
876 $table = $this->table();
877 $sql = str_replace('adodb_logsql',$table,$this->createTableSQL
);
878 $savelog = $this->conn
->LogSQL(false);
879 $ok = $this->conn
->Execute($sql);
880 $this->conn
->LogSQL($savelog);
881 return ($ok) ?
true : false;
888 $PHP_SELF = $_SERVER['PHP_SELF'];
889 $sql = isset($_REQUEST['sql']) ?
$_REQUEST['sql'] : '';
891 if (isset($_SESSION['phplens_sqlrows'])) $rows = $_SESSION['phplens_sqlrows'];
894 if (isset($_REQUEST['SMALLER'])) {
896 if ($rows < 3) $rows = 3;
897 $_SESSION['phplens_sqlrows'] = $rows;
899 if (isset($_REQUEST['BIGGER'])) {
901 $_SESSION['phplens_sqlrows'] = $rows;
906 <form method
="POST" action
="<?php echo $PHP_SELF ?>">
908 <td
> Form size
: <input type
="submit" value
=" < " name
="SMALLER"><input type
="submit" value
=" > > " name
="BIGGER">
911 <input type
="submit" value
=" Run SQL Below " name
="RUN"><input type
=hidden name
=do value
=dosql
>
914 <td colspan
=2><textarea rows
=<?php
print $rows; ?
> name
="sql" cols
="80"><?php
print htmlspecialchars($sql) ?
></textarea
>
921 if (!isset($_REQUEST['sql'])) return;
923 $sql = $this->undomq(trim($sql));
924 if (substr($sql,strlen($sql)-1) === ';') {
926 $sqla = $this->SplitSQL($sql);
931 foreach($sqla as $sqls) {
933 if (!$sqls) continue;
936 print "<p>".htmlspecialchars($sqls)."</p>";
939 $savelog = $this->conn
->LogSQL(false);
940 $rs = $this->conn
->Execute($sqls);
941 $this->conn
->LogSQL($savelog);
942 if ($rs && is_object($rs) && !$rs->EOF
) {
944 while ($rs->NextRecordSet()) {
945 print "<table width=98% bgcolor=#C0C0FF><tr><td> </td></tr></table>";
949 $e1 = (integer) $this->conn
->ErrorNo();
950 $e2 = $this->conn
->ErrorMsg();
951 if (($e1) ||
($e2)) {
952 if (empty($e1)) $e1 = '-1'; // postgresql fix
953 print ' '.$e1.': '.$e2;
955 print "<p>No Recordset returned<br></p>";
961 function SplitSQL($sql)
963 $arr = explode(';',$sql);
969 if (get_magic_quotes_gpc()) {
971 $m = str_replace('\\\\','\\',$m);
972 $m = str_replace('\"','"',$m);
973 $m = str_replace('\\\'','\'',$m);
979 /************************************************************************/
982 * Reorganise multiple table-indices/statistics/..
983 * OptimizeMode could be given by last Parameter
987 * optimizeTables( 'tableA');
990 * optimizeTables( 'tableA', 'tableB', 'tableC');
993 * optimizeTables( 'tableA', 'tableB', ADODB_OPT_LOW);
996 * @param string table name of the table to optimize
997 * @param int mode optimization-mode
998 * <code>ADODB_OPT_HIGH</code> for full optimization
999 * <code>ADODB_OPT_LOW</code> for CPU-less optimization
1000 * Default is LOW <code>ADODB_OPT_LOW</code>
1001 * @author Markus Staab
1002 * @return Returns <code>true</code> on success and <code>false</code> on error
1004 function OptimizeTables()
1006 $args = func_get_args();
1007 $numArgs = func_num_args();
1009 if ( $numArgs == 0) return false;
1011 $mode = ADODB_OPT_LOW
;
1012 $lastArg = $args[ $numArgs - 1];
1013 if ( !is_string($lastArg)) {
1015 unset( $args[ $numArgs - 1]);
1018 foreach( $args as $table) {
1019 $this->optimizeTable( $table, $mode);
1024 * Reorganise the table-indices/statistics/.. depending on the given mode.
1025 * Default Implementation throws an error.
1027 * @param string table name of the table to optimize
1028 * @param int mode optimization-mode
1029 * <code>ADODB_OPT_HIGH</code> for full optimization
1030 * <code>ADODB_OPT_LOW</code> for CPU-less optimization
1031 * Default is LOW <code>ADODB_OPT_LOW</code>
1032 * @author Markus Staab
1033 * @return Returns <code>true</code> on success and <code>false</code> on error
1035 function OptimizeTable( $table, $mode = ADODB_OPT_LOW
)
1037 ADOConnection
::outp( sprintf( "<p>%s: '%s' not implemented for driver '%s'</p>", __CLASS__
, __FUNCTION__
, $this->conn
->databaseType
));
1042 * Reorganise current database.
1043 * Default implementation loops over all <code>MetaTables()</code> and
1044 * optimize each using <code>optmizeTable()</code>
1046 * @author Markus Staab
1047 * @return Returns <code>true</code> on success and <code>false</code> on error
1049 function optimizeDatabase()
1051 $conn = $this->conn
;
1052 if ( !$conn) return false;
1054 $tables = $conn->MetaTables( 'TABLES');
1055 if ( !$tables ) return false;
1057 foreach( $tables as $table) {
1058 if ( !$this->optimizeTable( $table)) {