From ed2f7c32ed1d17469037fc84a8adecbd782c89d3 Mon Sep 17 00:00:00 2001 From: rMalie Date: Tue, 14 Feb 2012 09:27:41 +0000 Subject: [PATCH] // Improve PS profiling --- config/config.inc.php | 3 +- override/classes/_Controller.php | 420 -------------------- override/classes/controller/_Controller.php | 13 + 3 files changed, 15 insertions(+), 421 deletions(-) delete mode 100644 override/classes/_Controller.php diff --git a/config/config.inc.php b/config/config.inc.php index 9f30512a6..93de44263 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -62,9 +62,10 @@ require_once(dirname(__FILE__).'/autoload.php'); if (_PS_DEBUG_PROFILING_) { - include_once(_PS_ROOT_DIR_.'/override/classes/_Controller.php'); + include_once(_PS_ROOT_DIR_.'/override/classes/controller/_Controller.php'); include_once(_PS_ROOT_DIR_.'/override/classes/_Module.php'); include_once(_PS_ROOT_DIR_.'/override/classes/_ObjectModel.php'); + include_once(_PS_ROOT_DIR_.'/override/classes/_Hook.php'); include_once(_PS_ROOT_DIR_.'/override/classes/db/_Db.php'); } diff --git a/override/classes/_Controller.php b/override/classes/_Controller.php deleted file mode 100644 index fa810e712..000000000 --- a/override/classes/_Controller.php +++ /dev/null @@ -1,420 +0,0 @@ - -* @copyright 2007-2011 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -// -// IMPORTANT : don't forget to delete the underscore _ in the file name if you want to use it ! -// - -function developpementErrorHandler($errno, $errstr, $errfile, $errline) -{ - if (!(error_reporting() & $errno)) - return; - switch($errno) - { - case E_ERROR: - echo '[PHP Error #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_WARNING: - echo '[PHP Warning #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_PARSE: - echo '[PHP Parse #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_NOTICE: - echo '[PHP Notice #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_CORE_ERROR: - echo '[PHP Core #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_CORE_WARNING: - echo '[PHP Core warning #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_COMPILE_ERROR: - echo '[PHP Compile #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_COMPILE_WARNING: - echo '[PHP Compile warning #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_USER_ERROR: - echo '[PHP Error #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_USER_WARNING: - echo '[PHP User warning #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_USER_NOTICE: - echo '[PHP User notice #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_STRICT: - echo '[PHP Strict #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - case E_RECOVERABLE_ERROR: - echo '[PHP Recoverable error #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - break; - default: - echo '[PHP Unknown error #'.$errno.'] '.$errstr.' ('.$errfile.', line '.$errline.')'; - } - die; - return true; -} - -abstract class Controller extends ControllerCore -{ - public $_memory = array(); - public $_time = array(); - private static $_footer = true; - - public static function disableParentCalls() - { - self::$_footer = false; - } - - private function displayMemoryColor($n) - { - $n /= 1048576; - if ($n > 3) - return ''.round($n, 2).' Mb'; - if ($n > 1) - return ''.round($n, 2).' Mb'; - return ''.round($n, 2).' Mb'; - } - - private function displaySQLQueries($n) - { - if ($n > 150) - return ''.$n.' queries'; - if ($n > 100) - return ''.$n.' queries'; - return ''.$n.' quer'.($n == 1 ? 'y' : 'ies').''; - } - - private function displayLoadTimeColor($n, $kikoo = false) - { - if ($n > 1) - return ''.round($n, 3).'s'.($kikoo ? '
You\'d better run your shop on a toaster' : ''); - if ($n > 0.5) - return ''.round($n * 1000).'ms'.($kikoo ? '
I hope it is a shared hosting' : ''); - return ''.round($n * 1000).'ms'.($kikoo ? '
Good boy! That\'s what I call a webserver!' : ''); - } - - private function getTimeColor($n) - { - if ($n > 4) - return 'style="color:red"'; - if ($n > 2) - return 'style="color:orange"'; - return 'style="color:green"'; - } - - private function getQueryColor($n) - { - if ($n > 5) - return 'style="color:red"'; - if ($n > 2) - return 'style="color:orange"'; - return 'style="color:green"'; - } - - private function getTableColor($n) - { - if ($n > 30) - return 'style="color:red"'; - if ($n > 20) - return 'style="color:orange"'; - return 'style="color:green"'; - } - - private function getObjectModelColor($n) - { - if ($n > 50) - return 'style="color:red"'; - if ($n > 10) - return 'style="color:orange"'; - return 'style="color:green"'; - } - - public function __construct() - { - parent::__construct(); - - // error management - set_error_handler('developpementErrorHandler'); - ini_set('html_errors', 'on'); - ini_set('display_errors', 'on'); - error_reporting(E_ALL | E_STRICT); - - if (!self::$_footer) - return; - - $this->_memory['config'] = memory_get_usage(); - $this->_time['config'] = microtime(true); - - parent::__construct(); - $this->_memory['constructor'] = memory_get_usage(); - $this->_time['constructor'] = microtime(true); - } - - public function run() - { - $this->init(); - $this->_memory['init'] = memory_get_usage(); - $this->_time['init'] = microtime(true); - - if ($this->checkAccess()) - { - $this->_memory['checkAccess'] = memory_get_usage(); - $this->_time['checkAccess'] = microtime(true); - - if (!$this->content_only && ($this->display_header || (isset($this->className) && $this->className))) - $this->setMedia(); - $this->_memory['setMedia'] = memory_get_usage(); - $this->_time['setMedia'] = microtime(true); - - // postProcess handles ajaxProcess - $this->postProcess(); - $this->_memory['postProcess'] = memory_get_usage(); - $this->_time['postProcess'] = microtime(true); - - if (!empty($this->redirect_after)) - $this->redirect(); - - if (!$this->content_only && ($this->display_header || (isset($this->className) && $this->className))) - $this->initHeader(); - $this->_memory['initHeader'] = memory_get_usage(); - $this->_time['initHeader'] = microtime(true); - - $this->initContent(); - $this->_memory['initContent'] = memory_get_usage(); - $this->_time['initContent'] = microtime(true); - - if (!$this->content_only && ($this->display_footer || (isset($this->className) && $this->className))) - $this->initFooter(); - $this->_memory['initFooter'] = memory_get_usage(); - $this->_time['initFooter'] = microtime(true); - - // default behavior for ajax process is to use $_POST[action] or $_GET[action] - // then using displayAjax[action] - if ($this->ajax) - { - $action = Tools::getValue('action'); - if (!empty($action) && method_exists($this, 'displayAjax'.Tools::toCamelCase($action))) - $this->{'displayAjax'.$action}(); - elseif (method_exists($this, 'displayAjax')) - $this->displayAjax(); - } - else - $this->displayDebug(); - } - else - { - $this->initCursedPage(); - $this->displayDebug(); - } - } - - function ini_get_display_errors() - { - $a = 'display_errors'; - $b = ini_get($a); - switch (strtolower($b)) - { - case 'on': - case 'yes': - case 'true': - return 'assert.active' !== $a; - case 'stdout': - case 'stderr': - return 'display_errors' === $a; - default: - return (bool)(int)$b; - } - } - - private function sizeofvar($var) - { - $start_memory = memory_get_usage(); - $tmp = unserialize(serialize($var)); - $size = memory_get_usage() - $start_memory; - return $size; - } - - public function displayDebug() - { - global $start_time; - - $this->display(); - $this->_memory['display'] = memory_get_usage(); - $this->_time['display'] = microtime(true); - - if (!$this->ini_get_display_errors()) - return; - - $hr = '
'; - - $totalSize = 0; - foreach (get_included_files() as $file) - $totalSize += filesize($file); - - $totalQueryTime = 0; - foreach (Db::getInstance()->queries as $data) - $totalQueryTime += $data['time']; - - $hooktime = Module::getHookTime(); - arsort($hooktime); - $totalHookTime = 0; - foreach ($hooktime as $time) - $totalHookTime += $time; - - $globalSize = array(); - $totalGlobalSize = 0; - foreach ($GLOBALS as $key => $value) - if ($key != 'GLOBALS') - { - $totalGlobalSize += ($size = $this->sizeofvar($value)); - if ($size > 1024) - $globalSize[$key] = round($size / 1024, 1); - } - arsort($globalSize); - - echo '

-
- Load time: '.$this->displayLoadTimeColor($this->_time['display'] - $start_time, true).''; - if (self::$_footer) - echo ''; - echo '
-
- Hook processing: '.$this->displayLoadTimeColor($totalHookTime).' - -
-
- Memory peak usage: '.$this->displayMemoryColor(memory_get_peak_usage()).''; - if (self::$_footer) - { - echo ''; - } - echo '
'; - - echo ' -
- DB type: '.get_class(Db::getInstance()).' -
SQL Queries: '.$this->displaySQLQueries(count(Db::getInstance()->queries)).' -
Time spent querying: '.$this->displayLoadTimeColor($totalQueryTime).' -
-
- Included files: '.sizeof(get_included_files()).'
- Size of included files: '.$this->displayMemoryColor($totalSize).' -
-
- Globals (> 1 Ko only): '.round($totalGlobalSize / 1024).' Ko - -
'; - - echo ' -
- -
-
-

Stopwatch (with SQL_NO_CACHE) (total = '.count(Db::getInstance()->queries).')

'; - $queries = Db::getInstance()->queries; - foreach ($queries as $data) - echo $hr.'getTimeColor($data['time'] * 1000).'>'.round($data['time'] * 1000, 3).' ms '.$data['query']; - echo '
-
-

Doubles (IDs replaced by "XX") (total = '.count(Db::getInstance()->uniqQueries).')

'; - $queries = Db::getInstance()->uniqQueries; - arsort($queries); - foreach ($queries as $q => $nb) - echo $hr.'getQueryColor($nb).'>'.$nb.' '.$q; - echo '
-
-

Tables stress

'; - $tables = Db::getInstance()->tables; - arsort($tables); - foreach ($tables as $table => $nb) - echo $hr.'getTableColor($nb).'>'.$nb.' '.$table; - echo '
'; - - if (isset(ObjectModel::$debug_list)) - { - echo '
-

ObjectModel instances

'; - $list = ObjectModel::$debug_list; - uasort($list, create_function('$a,$b', 'return (count($a) < count($b)) ? 1 : -1;')); - $i = 0; - foreach ($list as $class => $info) - { - echo $hr.'getObjectModelColor(count($info)).'>'.count($info).' '; - echo ''.$class.''; - echo ''; - $i++; - } - echo '
'; - } - - // List of included files - echo '
-

Included files

'; - $i = 1; - foreach (get_included_files() as $file) - { - $file = ltrim(str_replace('\\', '/', str_replace(_PS_ROOT_DIR_, '', $file)), '/'); - $file = ''.dirname($file).'/'.basename($file).''; - echo $i.' '.$file.'
'; - $i++; - } - echo '
'; - } -} - diff --git a/override/classes/controller/_Controller.php b/override/classes/controller/_Controller.php index b399c2240..cd4340cc8 100644 --- a/override/classes/controller/_Controller.php +++ b/override/classes/controller/_Controller.php @@ -408,6 +408,19 @@ abstract class Controller extends ControllerCore } echo ''; } + + // List of included files + echo '
+

Included files

'; + $i = 1; + foreach (get_included_files() as $file) + { + $file = ltrim(str_replace('\\', '/', str_replace(_PS_ROOT_DIR_, '', $file)), '/'); + $file = ''.dirname($file).'/'.basename($file).''; + echo $i.' '.$file.'
'; + $i++; + } + echo '
'; } }