PHPDump — Отладка в консоли Google Chrome и взаимодействие с CMS MODX

Сразу к делу


Есть собственный продукт который успешно мне помогает в отладке и назвал его PhpDump.


В свое время CMS MODX побудил меня написать свой отладчик. Конечно же есть var_dump, phpConsole, xDebug в PHP. Но тут я со своим PhpDump.


Скажу что решение не идеальное, но очень практичное.


Насколько вам понравится, решать вам.


Вот несколько скринов, как это выглядит.




В статье расскажу, как установить и использовать его в CMS MODX Revo


Требования


Apache+PHP 7, CMS MODX Revo 2.7
Git + Composer


Загрузка и установка


  • Composer

Создайте каталог для PhpDump отдельно от ваших проектов. Так как возможно вы захотите его использовать на локальном сервере в разных проектах. Для этого не обязательно повсеместно его устанавливать.


В каталоге создайте файл composer.json со следующими данными:


{
    "require":{

        "Alpa/PhpDump":"1.*"
    },
    "repositories": [
        {
            "type": "git",
            "url": "https://github.com/ALexeyP0708/PhpDump.git"
        },
        {
            "type": "git",
            "url": "https://github.com/ALexeyP0708/EntityDetails"
        }
    ]
}

В терминале введите $ composer install


При установке через composer, проект будет находиться в папке [directory install]/vendor/PhpDump


  • Установка через GIT
    Команда для терминала
    $ git clone https://github.com/ALexeyP0708/PhpDump.git

Или распаковать zip архив.


скачать можно тут GitHub


Установка PhpDumpConsole


В Google Chrome переходим в раздел Расширения, включаем режим разработчика (в верхнем правом углу), далее Загрузить распакованное расширение.


Указываем директорию [directory PhpDump]/ChromeExtension/PhpDumpConsole_v1.1.


В панели появится красный значок в виде прицела -шестеренка в кругу. Если при нажатии шестеренка не превращается в синий цвет, то или сервер не поддерживает PhpDump или клиент не прошел авторизацию.


Проверка работоспособности


ознакомьтесь с файлом [dirictory Php Dump]/tests/test_debugManager.php


Если установили через композер, то вам необходимо указать правильный маршрут до файла автозагрузчика.


Для этого замените строку


    include_once __DIR__.'/../vendor/autoload.php';

на


    //include_once __DIR__.'/../vendor/autoload.php';
    include_once __DIR__.'/../../../autoload.php';

К каталогу где установлен PhpDump должен быть веб доступ и свободная маршрутизация к сценариям.


Допустим вы установили PhpDump в /sites/www/mysite/TestPhpDump а веб доступ к сайту http://mysite/ тогда для запуска сценария теста
http://mysite/TestPhpDump/tests/test_debugManager.php


Запустится страница с генерированными ошибками. Запустим консоль Google Chrome и нажимаем шестеренку в панели приложений. Страница перезагрузится, шестеренка превратится в синий цвет. Вся информация теперь отобразится в консоли.


Как запустить на своем проекте


В начале страницы, который запускает сценарий вашего проекта, необходимо указать:


    include_once '[directory phpdump]/vendor/autoload.php';//ваш путь до phpdump абсолютный или относительный.
    new PhpDump\InitDump();

Нужно понимать, что PhpDump запускается в том сценарии, где объявлены данные строки.
Также нужно учесть во внимание то, что PHPdumpConsole отображает дамп не только для основной страницы, но и для ajax запросов и для фронтенд скриптов формируемых сервером динамически.


Если ваш проект обращается хаотично к разным сценариям (например загрузилась страница через Index.php, а ajax запрос осуществился через other.php или браузер загружает динамические сформированный js скрипт из script.js.php ), то могут возникать непредвиденные ситуации.


В таком случае необходимо, чтобы вся маршрутизация проходила через один файл запуска сценариев. Например, через /index.php. Или применять дополнительные решения, как и было сделано с MODX (Ниже описано).


Запуск на тестовом сайте с CMS MODX


Для запуска PhpDump на CMS MODX Есть несколько решений.


Первое Решение — по инструкции выше, прописать в файле index.php вашего сайта код:


    include_once '[directory phpdump]/vendor/autoload.php'; 
    new PhpDump\InitDump();

В таком случае PhpDump будет работать в режиме отладки и отлова ошибок.


Но все что будет фигурировать в логах MODX, а также ошибки которые подавляются системой,
не будут выводится в PhpDumpConsole


Второй вариант: Официальный -без внесения кастомизации. Это расширение класса ErrorHandler и установка соответствующих переменных в параметрах MODX.


У такого решения есть недостаток. При неправильном внесении данных в настройки, сайт падает. И ситуацию можно исправить только через Базу данных.


Поэтому описание данного варианта опустим.


В таком варианте вы можете увидеть все сгенерированные ошибки PHP. Но не увидите сформированные логи, в которых фигурирует значительная часть ошибок MODX.


Третий вариант, на котором лично я остановился, это установка полной маршрутизации обращения к сценариям через файл 'dev_route.php';
С помощью .htaccess, все не статические обращения направлены на файл dev_route.php.


ВНИМАНИЕ: До конца поведение не исследовано. Возможно некоторые приложения могут предлагать иную логику запросов к сайту, маршрутизация которых не описана в dev_route.php.


ВНИМАНИЕ: .htaccess дописан не до конца. Не все статические ресурсы в нем определены. Поэтому будут обрабатываться в dev_route.php
Делаем бекап .htaccess файла старого.
Создаем новый .htaccess в корне директории сайта и вносим код:


# file .htaccess

#---------------------------------------- 
# Деактивируем запросы к не существующим файлам каталогов статического ресурса.  - Иначе сайт их будет обрабатывать как полноценный запрос.   
RewriteCond %{REQUEST_URI} /manager/min/assets/.* 
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} /manager/assets/.* 
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} /assets/.*
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ - [R=404,L]
#---------------------------------------

#---------------------------------------
# здесь перечисляем каталоги статических ресурсов   
RewriteCond %{REQUEST_URI} /manager/min/assets/.* 
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_URI} /manager/assets/.* 
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_URI} /assets/.*
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteRule ^(.*)$ $1 [L] 

#---------------------------------------

#---------------------------------------
# здесь перечисляем расширение статических ресурсов c правом свободного доступа.

RewriteCond %{REQUEST_FILENAME} .*\.js$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.html$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.css$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.gif$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.jpg$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.jpeg$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.png$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.svg$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.woff$
RewriteRule ^(.*)$ $1 [L]

#---------------------------------------

#---------------------------------------
# Перенаправляем запросы бекенда.

 RewriteCond %{REQUEST_URI} /manager(?:|/.*)  
 RewriteRule ^(.*)$ dev_route.php [L]
 RewriteCond %{REQUEST_URI} /connectors(?:|/.*)  
 RewriteRule ^(.*)$ dev_route.php [L]
#---------------------------------------

#---------------------------------------
# Перенаправляем все остальные запросы.

 RewriteCond %{REQUEST_URI} .*
 RewriteRule ^(.*)$ dev_route.php?q=$1 [L,QSA]

#---------------------------------------

Создаем в корне директории сайта файл dev_route.php и заносим в него код:


<?php
    include_once '[yor path php dump]/vendor/autoload.php';// Обязательно указываем путь к файлу автозагрузки классов 
    new \Alpa\PhpDump\InitDump();
    $redirect_url=$_SERVER['REDIRECT_URL'];
    $manager_path='manager';
    $manager_dir='manager';
    $connectors_path='connectors';
    $connectors_dir='connectors';
    if(preg_match("~^/{$manager_path}(|/[\s\S]*)$~",$redirect_url,$match)){
        if(trim($match[1])=='' || trim($match[1])=='/' || !is_file(__DIR__.'/'.$manager_dir.$match[1])){
            $match[1]='/index.php';
        }
        include_once __DIR__.'/'.$manager_dir.$match[1];
    } else 
    if(preg_match("~^/{$connectors_path}(|/[\s\S]*)$~",$redirect_url,$match)){
        if(trim($match[1])=='' || trim($match[1])=='/' || !is_file(__DIR__.'/'.$connectors_dir.$match[1])){
            $match[1]='/index.php';
        }
        include_once __DIR__.'/'.$connectors_dir.$match[1];
    } else
    if(empty($redirect_url) || $redirect_url=='/' ||  $redirect_url=='/index.php'){
        include_once __DIR__.'/index.php';
    }  else {
        //header( 'Location: /index.php' ); exit;
        include_once __DIR__.'/index.php';
    }
//include_once __DIR__.$redirect_url;

Далее в файле core\xpdo\xpdo.class.php (для MODX revo 2.7) оформить метод log следующим образом:


    public function log($level, $msg, $target= '', $def= '', $file= '', $line= '') {
        \deb::print($msg."=>[$target][$def][$file][$line]",'LOG');
        $this->_log($level, $msg, $target, $def, $file, $line); 
    }

И все. У вас все должно заработать должным образом.
Тестируем в админке. если админка загружается хорошо, то все сделали как надо.


Как использовать:


// выведет переменную любого типа. Рекурсивно предоставит все свойства объекта и массива
\deb::print($var,'point1');

// Предоставит рекурсивно детальную информацию по объекту.
\deb::dump($object,'point2');

// результат var_dump
\deb::vdump($object,'point3');

//результат var_export
 \deb::vexport($object,'point4');

// информация о классе
\deb::infoClass($name_class, 'point5');

//  вывод ошибок Предназначен как правило для внутренних целей. при генерации ошибки системой. 
\deb::error($errno = false, $errstr, $errfile = false, $errline = false, $errcontext = false);
//В лучшем случае вызывать ошибку стоит через trigger_error();

Настройки безопасности


PhpDump на данный момент не рассчитан на профессиональную работу, поэтому условия безопасности минимальны.


Если вы решили PhpDump прикрепить к действующему сайту на просторе интернет, то в файле [directory phpdump] /src/include_file_in_index.php изменить следующие настройки для авторизации:



$settings=[

    'hashkeys'=>[

     'HashKey'=>[ // любой ключ в виде строки (латиница).Будет являться публичным ключём

      'key'=>'HashKey', // дублируем строку ключа

      'greeting_server'=>'greeting_server', // ключ в виде строки для авторизации на стороне сервера

      'greeting_client'=>'greeting_client' // ключ для авторизации на стороне клиента.  

     ]

]

];

На стороне клиента в консоли, в выпадающем списке 'Java Scripts Context' выбрать PhpDumpConsole и в консоли введите код


dm.setHashKey({

 hashkey:'HashKey',

 greeting_server:'greeting_server',  

 greeting_client:'greeting_client'

 });  
//где параметры hashkey , greeting_server, greeting_client устанавливаете такие же как и на сервере.

dm.bindHashKeyDomain({hashkey:'HashKey',domain:'global'}); // или domain:'your_domain' 
//если domain='global'  будет применяться по умолчанию для всех сайтов к которым не установлена авторизация по другому ключу.  

Другие плюшки


Через консоль можно управлять включением/выключением бектрейса, фильтровать вывод.
Все это можете узнать в инструкциях на странице GitHub
PhpDump можно использовать не только для MODX, но и в других проектах. Главное знать как прикрутить.


P.S.: Если вы поклонники MODX, то в скором вас ждет новые плюшка: Способ формирования снипетов "Разделяй и Властвуй". Снипеты логики и снипеты шаблонов смогут самоорганизовываться и группироваться друг с другом, тем самым комбинацией 2х-3х снипетов вы сможете расширять поведение.


Появляется гибкость в написании снипетов. Программистам не надо будет описывать полный цикл написания снипета, а лишь отдельную часть, описывая его API для дальнейшего взаимодействия с другими снипетами.


Всем спасибо.

Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 13

    +2
    почему не приделали все это в виде обычного расширения/плагина/модуля или как там это называется в modx? В проекте на чем-то современном использовать это нет смысла т.к. уже существуют
    http://phpdebugbar.com/
    https://github.com/symfony/var-dumper
    По самому коду — очень неряшливо написано, постоянные смешивания конструкций
    	namespace Alpa\PhpDump;
    	// the file for the autoloader will load when accessing the class.
    	include_once __DIR__.'/../include_file_in_index.php';
    

    и кучи закомментированных кусков кода
    а также куски с дебаг-информацией
    Ну и завязка на апач тоже не в плюс
      +1
      Tracy легко внедряется и кастомизируется под любой проект
        +1
        тоже хороший вариант. автору проще было бы интегрировать что-то из этого в modx чем писать с нуля то что он написал
          0
          Проект является не только для MODX. Я написал его для себя. Просто поделился. Будет неоднократный рефакторинг и code review как руки дойдут. Но пока что работает, не хочу трогать и прокачивать.
          0
          Почитал доку Tracy. Там при анализе объектов и массивов, есть ограничение по глубине вложений. Я в свое время встретился с таким же ограничением в PhpConsole и отсутствием детализированных данных. Это меня и побудило написать собственную реализацию по анализу массивов и объектов. В моем случае можно анализировать толстые объекты и массивы с неограниченной вложенностью. Конечно может возникнуть ошибка memory size, но она возникнет при очень жирных объектах. Пока это единственное ограничение. По степени необходимости, по этой части будет рефакторинг.
          С объектом $modx со всеми его вложениями справляется в легкую. Также петли, не повлияют на анализ. Они вычисляются и исключаются.
          А рекурсивная детализация объекта, не однократно спасала. Можно посмотреть как детализирует состояние объекта. через вызов \deb::dump($obj); Возможно есть другие компоненты которые я не до оценил. Но на меня нашло вдохновение написать что то собственное.
            0
            — Tracy это панель сводной информации куда удобно выводить вкладки (какие события были запущены и с какими параметрами) / какие чанки / сниппеты отработаны / под каким юзером работаете и т.п.
            — Если говорить конкретно за дамп, то раз нет доступа к xDebug можно воспользоваться var-dumper как уже сказали выше. В Tracy он действительно немного убогий

            По большому счету вы просто попытались совместить 2 инструмента в 1. Чтож, это ваше право…
          0
          Причин несколько.
          Реализация по большому счету не должна интегрироваться в фреймворки или CMS, а выполняться параллельно. Один раз установил на dev машине, потом где необходим анализ, в том проекте и подключаешь. Изначально пользовался с помощью плагина. Но почему отказался от такой реализации*? А до инициализации события MODXInit сколько строчек кода пропустим*? Может необходимо отладить код в самом MODX? К примеру, в один момент необходимо было провести анализ Index.php, чтобы внести свою корректировку для мультисайтовости. А если код падает до инициализации компонента, то вычислить проблему вообще не возможно. Если PHPDump будет запускать ранее до запуска основного сценария, то проблемы можно отслеживать.


          0
          Для запуска PhpDump на CMS MODX Есть несколько решений.

          Вариант с плагином на событиях OnInitCulture или OnMODXInit был бы более предпочтителен
            +1
            По-моему, clockwork на порядок удобнее и полезнее будет. Туда не только дампы можно впихнуть, но и кучу другой сопутствующей информации. А т.к. это ещё и расширение для браузера, то можно и в API использовать, где не должно быть другой информации, вроде скриптов.
              +1
              Смотря на ваши куски кода, кровь из глаз идёт…
                0
                Когда сам смотрю, тоже кровь идет. Но сначала реализуешь идею, перекладывая мысли в код, потом ее приводишь в порядок. Но пока собираюсь духом привести все в порядок.
                0
                Никак не могу понять вечное массовое игнорирование Xdebug'а.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое