Сразу к делу
Есть собственный продукт который успешно мне помогает в отладке и назвал его 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 для дальнейшего взаимодействия с другими снипетами.
Всем спасибо.


