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