Ответ 1
Вы можете использовать register_tick_function
и просто выгружать memeory_get_usage
из каждого тика (строки) и анализировать его позже. Приведенный ниже класс можно улучшить, используя debug_backtrace
, чтобы найти номер строки, относящийся к использованию памяти или добавляя время в строке с помощью microtime
.
Класс Profiler
class Profiler
{
private $_data_array = array();
function __construct()
{
register_tick_function( array( $this, "tick" ) );
declare(ticks = 1);
}
function __destruct()
{
unregister_tick_function( array( $this, "tick" ) );
}
function tick()
{
$this->_data_array[] = array(
"memory" => memory_get_usage(),
"time" => microtime( TRUE ),
//if you need a backtrace you can uncomment this next line
//"backtrace" => debug_backtrace( FALSE ),
);
}
function getDataArray()
{
return $this->_data_array;
}
}
Пример
class Example
{
public function hello($name)
{
$something = str_repeat($name, pow(1024, 2));
}
}
$profiler = new Profiler(); //starts logging when created
$class = new Example;
$class->hello('a');
$data_array = $profiler->getDataArray();
unset( $profiler ); //stops logging when __destruct is called
print_r( $data_array );
Выход
Array (
[0] => Array (
[memory] => 638088
[time] => 1290788749.72
)
[1] => Array (
[memory] => 638896
[time] => 1290788749.72
)
[2] => Array (
[memory] => 639536
[time] => 1290788749.72
)
[3] => Array (
[memory] => 640480
[time] => 1290788749.72
)
[4] => Array (
[memory] => 1689800 // <~ money!
[time] => 1290788749.72
)
[5] => Array (
[memory] => 641664
[time] => 1290788749.72
)
)
Возможная проблема
Поскольку этот класс профилировщика хранит данные в PHP, общее использование памяти будет увеличиваться искусственно. Одним из способов обойти эту проблему было бы записать данные в файл по ходу (сериализованному), и когда вы сделаете это, вы сможете его прочитать.