Add Class for Memory Usage tracking
This commit is contained in:
119
4dev/tests/CoreLibsDebugMemoryUsageTest.php
Normal file
119
4dev/tests/CoreLibsDebugMemoryUsageTest.php
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Debug\MemoryUsage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Debug\MemoryUsage
|
||||||
|
* @coversDefaultClass \CoreLibs\Debug\MemoryUsage
|
||||||
|
* @testdox \CoreLibs\Debug\MemoryUsage method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsDebugMemoryUsageTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function memoryUsageProvider(): array
|
||||||
|
{
|
||||||
|
$regex_raw_off = '/^\[[\w\s_-]+\] Peak\/Curr\/Change: \d+(\.\d+)? ?\w{1,2}\/'
|
||||||
|
. '\d+(\.\d+)? ?\w{1,2}\/'
|
||||||
|
. 'Since Start: \d+(\.\d+)? ?\w{1,2} \| '
|
||||||
|
. 'Since Last: \d+(\.\d+)? ?\w{1,2} \| '
|
||||||
|
. 'Since Set: \d+(\.\d+)? ?\w{1,2}$/';
|
||||||
|
$regex_raw_on = '/^\[[\w\s_-]+\] Peak\/Curr\/'
|
||||||
|
// . 'Change: \d+(\.\d+)? ?\w{1,2}\/\d+(\.\d+)? ?\w{1,2} \[\d+\]\/'
|
||||||
|
. 'Change: \d+(\.\d+)? ?\w{1,2}\/\d+(\.\d+)? ?\w{1,2}/'
|
||||||
|
. 'Since Start: \d+(\.\d+)? ?\w{1,2} \[\d+\] \| '
|
||||||
|
. 'Since Last: \d+(\.\d+)? ?\w{1,2} \[\d+\] \| '
|
||||||
|
. 'Since Set: \d+(\.\d+)? ?\w{1,2} \[\d+\]$/';
|
||||||
|
$regex_array = [
|
||||||
|
'prefix' => '/^[\w\s_-]+$/',
|
||||||
|
'peak' => '/^\d+$/',
|
||||||
|
'usage' => '/^\d+$/',
|
||||||
|
'start' => '/^\d+$/',
|
||||||
|
'last' => '/^\d+$/',
|
||||||
|
'set' => '/^\d+$/',
|
||||||
|
];
|
||||||
|
// 0: prefix
|
||||||
|
// 1: raw flag
|
||||||
|
// 2: set flags array
|
||||||
|
// 3: array output expected (as regex)
|
||||||
|
// 4: string output expected (as regex)
|
||||||
|
return [
|
||||||
|
'test normal' => [
|
||||||
|
'test',
|
||||||
|
null,
|
||||||
|
[],
|
||||||
|
$regex_array,
|
||||||
|
$regex_raw_off,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::resetMemory
|
||||||
|
* @cover ::debugMemoryFlag
|
||||||
|
* @cover ::setStartMemory
|
||||||
|
* @cover ::setMemory
|
||||||
|
* @cover ::memoryUsage
|
||||||
|
* @cover ::printMemoryUsage
|
||||||
|
* @dataProvider memoryUsageProvider
|
||||||
|
* @testdox memoryUsage with $prefix, raw memory $raw [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $prefix
|
||||||
|
* @param bool|null $raw
|
||||||
|
* @param array $set_flags
|
||||||
|
* @param array $expected_array
|
||||||
|
* @param string $expected_string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMemoryUsage(
|
||||||
|
string $prefix,
|
||||||
|
?bool $raw,
|
||||||
|
array $settings,
|
||||||
|
array $expected_array,
|
||||||
|
string $expected_string
|
||||||
|
): void {
|
||||||
|
// always reeset to null
|
||||||
|
MemoryUsage::resetMemory();
|
||||||
|
MemoryUsage::debugMemoryFlag(true);
|
||||||
|
MemoryUsage::setStartMemory();
|
||||||
|
MemoryUsage::setMemory();
|
||||||
|
// run collector
|
||||||
|
$memory = MemoryUsage::memoryUsage($prefix);
|
||||||
|
if ($raw === null) {
|
||||||
|
$string = MemoryUsage::printMemoryUsage($memory);
|
||||||
|
} else {
|
||||||
|
$string = MemoryUsage::printMemoryUsage($memory, $raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
// expected_array for each
|
||||||
|
foreach ($expected_array as $name => $regex) {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$regex,
|
||||||
|
(string)$memory[$name],
|
||||||
|
'assert memory usage array ' . $name
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// regex match string
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$expected_string,
|
||||||
|
$string,
|
||||||
|
'assert memory usage string as regex'
|
||||||
|
);
|
||||||
|
|
||||||
|
// TODO additional tests with use more memory and check diff matching
|
||||||
|
// TODO reset memory usage test
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
91
www/admin/class_test.memoryusage.php
Normal file
91
www/admin/class_test.memoryusage.php
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<?php // phpcs:ignore warning
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
|
||||||
|
$DEBUG_ALL = 1;
|
||||||
|
$PRINT_ALL = 1;
|
||||||
|
$DB_DEBUG = 1;
|
||||||
|
|
||||||
|
if ($DEBUG_ALL) {
|
||||||
|
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
// basic class test file
|
||||||
|
define('USE_DATABASE', false);
|
||||||
|
// sample config
|
||||||
|
require 'config.php';
|
||||||
|
// define log file id
|
||||||
|
$LOG_FILE_ID = 'classTest-memoryusage';
|
||||||
|
ob_end_flush();
|
||||||
|
|
||||||
|
use CoreLibs\Debug\MemoryUsage;
|
||||||
|
use CoreLibs\Debug\Support;
|
||||||
|
|
||||||
|
$log = new CoreLibs\Debug\Logging([
|
||||||
|
'log_folder' => BASE . LOG,
|
||||||
|
'file_id' => $LOG_FILE_ID,
|
||||||
|
// add file date
|
||||||
|
'print_file_date' => true,
|
||||||
|
// set debug and print flags
|
||||||
|
'debug_all' => $DEBUG_ALL ?? false,
|
||||||
|
'echo_all' => $ECHO_ALL ?? false,
|
||||||
|
'print_all' => $PRINT_ALL ?? false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$PAGE_NAME = 'TEST CLASS: MEMORY USAGE';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
|
print "<body>";
|
||||||
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
|
MemoryUsage::debugMemoryFlag(true);
|
||||||
|
print "Debug Flag: " . Support::printBool(MemoryUsage::debugMemoryFlag()) . "<br>";
|
||||||
|
MemoryUsage::setStartMemory();
|
||||||
|
MemoryUsage::setMemory();
|
||||||
|
$data = MemoryUsage::memoryUsage('first run');
|
||||||
|
print "Memory usage 1 array: " . Support::printAr($data) . "<br>";
|
||||||
|
print "Memory usage 1 string: " . MemoryUsage::printMemoryUsage($data) . "<br>";
|
||||||
|
print "Memory usage 1 string raw: " . MemoryUsage::printMemoryUsage($data, true) . "<br>";
|
||||||
|
$var = 'foo';
|
||||||
|
$out = '';
|
||||||
|
for ($i = 1; $i <= 100; $i++) {
|
||||||
|
$out .= $var;
|
||||||
|
}
|
||||||
|
$data = MemoryUsage::memoryUsage('second run');
|
||||||
|
print "Memory usage 2 array: " . Support::printAr($data) . "<br>";
|
||||||
|
print "Memory usage 2 string: " . MemoryUsage::printMemoryUsage($data) . "<br>";
|
||||||
|
print "Memory usage 2 string raw: " . MemoryUsage::printMemoryUsage($data, true) . "<br>";
|
||||||
|
MemoryUsage::setMemory();
|
||||||
|
$var = 'foasdfasdfasdfasdfasdfo';
|
||||||
|
$out = '';
|
||||||
|
for ($i = 1; $i <= 10000; $i++) {
|
||||||
|
$out .= $var;
|
||||||
|
}
|
||||||
|
$data = MemoryUsage::memoryUsage('third run');
|
||||||
|
print "Memory usage 3 array: " . Support::printAr($data) . "<br>";
|
||||||
|
print "Memory usage 3 string: " . MemoryUsage::printMemoryUsage($data) . "<br>";
|
||||||
|
print "Memory usage 3 string raw: " . MemoryUsage::printMemoryUsage($data, true) . "<br>";
|
||||||
|
$var = 'foasdfasdfasdasdfasdfasdfadfadfasdfasdfo';
|
||||||
|
$out = '';
|
||||||
|
for ($i = 1; $i <= 100000; $i++) {
|
||||||
|
$out .= $var;
|
||||||
|
}
|
||||||
|
$data = MemoryUsage::memoryUsage('forth run');
|
||||||
|
print "Memory usage 4 array: " . Support::printAr($data) . "<br>";
|
||||||
|
print "Memory usage 4 string: " . MemoryUsage::printMemoryUsage($data) . "<br>";
|
||||||
|
print "Memory usage 4 string raw: " . MemoryUsage::printMemoryUsage($data, true) . "<br>";
|
||||||
|
|
||||||
|
// error message
|
||||||
|
print $log->printErrorMsg();
|
||||||
|
|
||||||
|
print "</body></html>";
|
||||||
|
|
||||||
|
// __END__
|
||||||
129
www/lib/CoreLibs/Debug/MemoryUsage.php
Normal file
129
www/lib/CoreLibs/Debug/MemoryUsage.php
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dump memory usage
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Debug;
|
||||||
|
|
||||||
|
use CoreLibs\Convert\Byte;
|
||||||
|
|
||||||
|
class MemoryUsage
|
||||||
|
{
|
||||||
|
/** @var int */
|
||||||
|
private static $start_memory = 0;
|
||||||
|
/** @var int */
|
||||||
|
private static $set_memory = 0;
|
||||||
|
/** @var int */
|
||||||
|
private static $previous_memory = 0;
|
||||||
|
/** @var bool */
|
||||||
|
private static $debug_memory = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set memory flag, or return set memory flag
|
||||||
|
*
|
||||||
|
* @param bool|null $set_debug
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function debugMemoryFlag(?bool $set_debug = null): bool
|
||||||
|
{
|
||||||
|
if ($set_debug === null) {
|
||||||
|
return self::$debug_memory;
|
||||||
|
}
|
||||||
|
self::$debug_memory = $set_debug;
|
||||||
|
return self::$debug_memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset all memory variables to 0
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function resetMemory(): void
|
||||||
|
{
|
||||||
|
self::$start_memory = 0;
|
||||||
|
self::$set_memory = 0;
|
||||||
|
self::$previous_memory = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the start memory velue, or reset to a new start value
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setStartMemory(): void
|
||||||
|
{
|
||||||
|
self::$start_memory = memory_get_usage();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the and independent memory set for a sub tracking outside main
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setMemory(): void
|
||||||
|
{
|
||||||
|
self::$set_memory = memory_get_usage();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* calculate and set memory usage values
|
||||||
|
* this will return an array with all the data that can be used in
|
||||||
|
* printMemoryUsage for human readable output
|
||||||
|
*
|
||||||
|
* @param string $prefix A prefix tag
|
||||||
|
* @return array<string,int|string> return array
|
||||||
|
*/
|
||||||
|
public static function memoryUsage(string $prefix): array
|
||||||
|
{
|
||||||
|
// skip if DEBUG is off
|
||||||
|
if (self::$debug_memory === false) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
if (empty(self::$start_memory)) {
|
||||||
|
self::$start_memory = memory_get_usage();
|
||||||
|
}
|
||||||
|
$memory_usage = memory_get_usage();
|
||||||
|
$data = [
|
||||||
|
'prefix' => $prefix,
|
||||||
|
'peak' => memory_get_peak_usage(),
|
||||||
|
'usage' => $memory_usage,
|
||||||
|
'start' => $memory_usage - self::$start_memory,
|
||||||
|
'last' => $memory_usage - self::$previous_memory,
|
||||||
|
'set' => $memory_usage - self::$set_memory
|
||||||
|
];
|
||||||
|
self::$previous_memory = $memory_usage;
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns a human readable output from the memoryUsage function
|
||||||
|
* can be used for logging purpose
|
||||||
|
*
|
||||||
|
* @param array<string,int|string> $data Data array from memoryUsage
|
||||||
|
* @param bool $raw Flag to shaw unconverted memory numbers
|
||||||
|
* @return string Return debug string with memory usage
|
||||||
|
*/
|
||||||
|
public static function printMemoryUsage(array $data, bool $raw = false): string
|
||||||
|
{
|
||||||
|
return
|
||||||
|
'[' . $data['prefix'] . '] Peak/Curr/Change: '
|
||||||
|
. Byte::humanReadableByteFormat($data['peak'])
|
||||||
|
. '/'
|
||||||
|
. Byte::humanReadableByteFormat($data['usage'])
|
||||||
|
// . ($raw === true ? ' [' . $data['usage'] . ']' : '')
|
||||||
|
. '/Since Start: '
|
||||||
|
. Byte::humanReadableByteFormat($data['start'])
|
||||||
|
. ($raw === true ? ' [' . $data['start'] . ']' : '')
|
||||||
|
. ' | Since Last: '
|
||||||
|
. Byte::humanReadableByteFormat($data['last'])
|
||||||
|
. ($raw === true ? ' [' . $data['last'] . ']' : '')
|
||||||
|
. ' | Since Set: '
|
||||||
|
. Byte::humanReadableByteFormat($data['set'])
|
||||||
|
. ($raw === true ? ' [' . $data['set'] . ']' : '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
1
www/vendor/composer/autoload_classmap.php
vendored
1
www/vendor/composer/autoload_classmap.php
vendored
@@ -37,6 +37,7 @@ return array(
|
|||||||
'CoreLibs\\DB\\SQL\\SqlInterface\\SqlFunctions' => $baseDir . '/lib/CoreLibs/DB/SQL/SqlInterface/SqlFunctions.php',
|
'CoreLibs\\DB\\SQL\\SqlInterface\\SqlFunctions' => $baseDir . '/lib/CoreLibs/DB/SQL/SqlInterface/SqlFunctions.php',
|
||||||
'CoreLibs\\Debug\\FileWriter' => $baseDir . '/lib/CoreLibs/Debug/FileWriter.php',
|
'CoreLibs\\Debug\\FileWriter' => $baseDir . '/lib/CoreLibs/Debug/FileWriter.php',
|
||||||
'CoreLibs\\Debug\\Logging' => $baseDir . '/lib/CoreLibs/Debug/Logging.php',
|
'CoreLibs\\Debug\\Logging' => $baseDir . '/lib/CoreLibs/Debug/Logging.php',
|
||||||
|
'CoreLibs\\Debug\\MemoryUsage' => $baseDir . '/lib/CoreLibs/Debug/MemoryUsage.php',
|
||||||
'CoreLibs\\Debug\\RunningTime' => $baseDir . '/lib/CoreLibs/Debug/RunningTime.php',
|
'CoreLibs\\Debug\\RunningTime' => $baseDir . '/lib/CoreLibs/Debug/RunningTime.php',
|
||||||
'CoreLibs\\Debug\\Support' => $baseDir . '/lib/CoreLibs/Debug/Support.php',
|
'CoreLibs\\Debug\\Support' => $baseDir . '/lib/CoreLibs/Debug/Support.php',
|
||||||
'CoreLibs\\Get\\ReadEnvFile' => $baseDir . '/lib/CoreLibs/Get/ReadEnvFile.php',
|
'CoreLibs\\Get\\ReadEnvFile' => $baseDir . '/lib/CoreLibs/Get/ReadEnvFile.php',
|
||||||
|
|||||||
1
www/vendor/composer/autoload_static.php
vendored
1
www/vendor/composer/autoload_static.php
vendored
@@ -102,6 +102,7 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
|
|||||||
'CoreLibs\\DB\\SQL\\SqlInterface\\SqlFunctions' => __DIR__ . '/../..' . '/lib/CoreLibs/DB/SQL/SqlInterface/SqlFunctions.php',
|
'CoreLibs\\DB\\SQL\\SqlInterface\\SqlFunctions' => __DIR__ . '/../..' . '/lib/CoreLibs/DB/SQL/SqlInterface/SqlFunctions.php',
|
||||||
'CoreLibs\\Debug\\FileWriter' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/FileWriter.php',
|
'CoreLibs\\Debug\\FileWriter' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/FileWriter.php',
|
||||||
'CoreLibs\\Debug\\Logging' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/Logging.php',
|
'CoreLibs\\Debug\\Logging' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/Logging.php',
|
||||||
|
'CoreLibs\\Debug\\MemoryUsage' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/MemoryUsage.php',
|
||||||
'CoreLibs\\Debug\\RunningTime' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/RunningTime.php',
|
'CoreLibs\\Debug\\RunningTime' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/RunningTime.php',
|
||||||
'CoreLibs\\Debug\\Support' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/Support.php',
|
'CoreLibs\\Debug\\Support' => __DIR__ . '/../..' . '/lib/CoreLibs/Debug/Support.php',
|
||||||
'CoreLibs\\Get\\ReadEnvFile' => __DIR__ . '/../..' . '/lib/CoreLibs/Get/ReadEnvFile.php',
|
'CoreLibs\\Get\\ReadEnvFile' => __DIR__ . '/../..' . '/lib/CoreLibs/Get/ReadEnvFile.php',
|
||||||
|
|||||||
Reference in New Issue
Block a user