<?php
class debug
{
/**
* Функция оставляет человекочитаемый вывод функции в html потоке
* Работоспособна в режиме cli
* @param mixed $msg - вывод информации
* @param string $title - иногда удобно подписывать что тут выводится
* @param array $options - статически сохраняемый массив параметров.
* - root - корень проекта, минимизируем название файла, обрезая корень default: SERVER['DOCUMENT_ROOT'] или __DIR__
* - type - [var_dump|print_r|var_export:default]
* @return void
*/
static function _($msg, $title = '', $options = [])
{
static $notafirsttime, $debug_options = [], $debug_dump = [];
if (!empty($options)) {
$debug_options = array_merge($debug_options, $options);
}
if (!empty($msg)) {
$raw_backtrace = debug_backtrace();
if (!isset($debug_options['root'])) {
if (isset($_SERVER) && isset($_SERVER['DOCUMENT_ROOT']) && !empty($_SERVER['DOCUMENT_ROOT'])) {
$debug_options['root'] = $_SERVER['DOCUMENT_ROOT'];
} else {
$debug_options['root'] = __DIR__;
}
}
$backtrace = [];
foreach ($raw_backtrace as $bt) {
$line = str_replace($debug_options['root'], '~', $bt['file']) . ':' . $bt['line'];
if (isset($bt['class'])) {
$backtrace[] = $bt['class'] . '::' . $bt['function'] . ' ' . $line;
} elseif (isset($bt['function'])) {
$backtrace[] = $bt['function'] . ' ' . $line;
}
}
if (isset($debug_options['type']) && $debug_options['type'] == 'var_dump') {
ob_start();
var_dump($msg);
$msg = ob_get_clean();
} elseif (isset($debug_options['type']) && $debug_options['type'] == 'print_r') {
$msg = print_r($msg, true);
} else {
$msg = var_export($msg, true);
}
$debug_dump[] = [$title, implode("\n", $backtrace), $msg];
}
if (empty($notafirsttime)) {
$notafirsttime = true;
register_shutdown_function(function () use (&$debug_dump) {
if (!empty($debug_dump)) {
$headers = headers_list();
if (empty($headers)) {
$method = 'plain';
} else {
$method = 'none';
}
if (isset($_SERVER) && isset($_SERVER['HTTP_ACCEPT']) && preg_match('~text/html~', $_SERVER['HTTP_ACCEPT'])) {
$method = 'html';
}
foreach ($headers as $h) {
if (preg_match('~Content\-type\: text/html~')) $method = 'html';
}
if ($method == 'plain') {
foreach ($debug_dump as $dl) {
echo $dl[0] . ' ' . $dl[1] . ': ' . "\n" . $dl[2] . "\n";
}
// var_export($debug_dump);
} else {
$tpl = <<<'HTML'
<style>
div.mc__debugger {
position:fixed; top:0;right:0;
width:40%; height:100%;
background: lightgray;
overflow:auto;
}
div.mc__debugger.hidden {
width:2em; height:1.5em;
overflow: hidden;
}
div.control-button {
position:fixed; top:0;right:0;
width:2em; height:1.5em;
background: red;
}
</style>
<script>
const $container = document.createElement(`div`);
const $debugEntry = document.createElement(`div`);
const $button = document.createElement(`div`);
$container.classList.add(`mc__debugger`);
$container.classList.add(`hidden`);
$debugEntry.classList.add(`debug-entry`);
$button.classList.add(`control-button`);
$container.appendChild($button);
for (let x of {{json_data}}){
let $pre = document.createElement(`pre`);
$pre.innerText=x;
$debugEntry.appendChild($pre);
}
$container.appendChild($debugEntry);
document.body.appendChild($container);
$button.addEventListener("click", () => {
$container.classList.toggle("hidden");
});
</script>
HTML;
echo preg_replace_callback('/{{\s*([^}]+)\s*}}/', function ($m) use ($debug_dump) {
switch ($m[1]) {
case 'json_data':
return json_encode($debug_dump, JSON_UNESCAPED_UNICODE);
}
return '';
}, $tpl);
}
}
$debug_dump = [];
});
}
}
}
<?php
include 'debug.php';
// тестируем
class testclass
{
function testfunc()
{
debug(4, 'step4');
}
}
$x = 1;
echo $x;
debug($x, 'step1', ['type' => 'var_export', 'root'=>__DIR__]); // root=>$_SERVER['DOCUMENT_ROOT']
$x++;
echo $x;
debug([1,2,3,[4,5,6,[7,8,9]]], 'step2');
$t = new testclass();
$t->testfunc();
die();
$x++;
echo $x;
debug($x, 'step3');
function val($rec, $disp = '', $default = '')
{
if (empty($disp) && $disp !== '0') {
if (empty($rec)) return $default;
return $rec;
}
$x = explode('|', $disp);
$v = $rec;
foreach ($x as $xx) {
if (is_object($v) && property_exists($v, $xx)) {
$v = $v->$xx;
} elseif (is_array($v) && array_key_exists($xx, $v)) {
$v = $v[$xx];
} else {
$v = $default;
break;
}
}
return $v;
}
$result_match = preg_match('/Цена(\d{1,6})[рр₽](?:[^aак]|$)|Цена(\d{1,6})(?:[^aак]|$)|[^-р](\d{1,6})[рр₽](?:[^aак]|$)|ц(\d{1,6})(?:[^в]|$)/iu', $post, $matches_gross_result );
if ($result_match == true) {
$pattern= array_shift($matches_gross_result); // $pattern - найденная подстрока, вдруг зачем то пригодится
$matches=implode('',$matches_gross_result); // найденная цена - собственно без дополнительной магии.
...
mysql <<< "show full processlist\g"
Это, конечно, если mysql база... Для других баз, вероятно, тоже можно подобный запрос выполнять.<input type="file" accept="audio/*" capture="user">
Имеются противопоказания - не только лишь все броузеры такое любят и поддерживают.<div style="width:240px;height:40px;display:inline-block;position:relative;">
<script async ...></script>
<div style="pointer-events:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:100;background:gray;"
</div>
pointer-events:none;
. Вот туда уже можно рисовать в бякграунде что угодно.