Отладка PHP кода выполняется самыми разными способами. Можно выводить информацию на экран, с помощью die или var_dump , с помощью файлов журнала, в которые пишутся сообщения об ошибках и предупреждения. Плохо то, что почти все перечисленные методы вносят нарушения в шаблон страниц и сообщения достаточно трудно вычленять в потоке другой информации.

Почему бы не использовать один инструмент для всех скриптов (и PHP и Javascript)? Таким инструментом может стать консоль JavaScript, которую можно использовать и для отладки PHP кода. Консоль входит в набор разработчика, который присутствует практически во всех современных браузерах по умолчанию или доступен в виде удобного дополнения. Она предоставляет собой отличный инструмент для цветного вывода с номером строки и всем, что нужно. А кроме того, можно выводить значения массивов и целых объектов в консоль.

Конечно, есть браузеры, в которых консоль отсутствует (например, IE) и инструмент отладки может нарушить процесс выполнения приложения. Но мы позаботимся, чтобы все проходило отлично.

Вот класс, который выполняет всю работу:

Class PHPDebug { function __construct() { if (!defined("LOG")) define("LOG",1); if (!defined("INFO")) define("INFO",2); if (!defined("WARN")) define("WARN",3); if (!defined("ERROR")) define("ERROR",4); define("NL","\r\n"); echo "".NL; /// Данный код предназначен для браузеров без консоли echo "if (!window.console) console = {};"; echo "console.log = console.log || function(){};"; echo "console.warn = console.warn || function(){};"; echo "console.error = console.error || function(){};"; echo "console.info = console.info || function(){};"; echo "console.debug = console.debug || function(){};"; echo ""; /// Конец секции для браузеров без консоли } function debug($name, $var = null, $type = LOG) { echo "".NL; switch($type) { case LOG: echo "console.log("".$name."");".NL; break; case INFO: echo "console.info("".$name."");".NL; break; case WARN: echo "console.warn("".$name."");".NL; break; case ERROR: echo "console.error("".$name."");".NL; break; } if (!empty($var)) { if (is_object($var) || is_array($var)) { $object = json_encode($var); echo "var object".preg_replace("~[^A-Z|0-9]~i","_",$name)." = \"".str_replace(""","\"",$object)."\";".NL; echo "var val".preg_replace("~[^A-Z|0-9]~i","_",$name)." = eval("(" + object".preg_replace("~[^A-Z|0-9]~i","_",$name)." + ")");".NL; switch($type) { case LOG: echo "console.debug(val".preg_replace("~[^A-Z|0-9]~i","_",$name).");".NL; break; case INFO: echo "console.info(val".preg_replace("~[^A-Z|0-9]~i","_",$name).");".NL; break; case WARN: echo "console.warn(val".preg_replace("~[^A-Z|0-9]~i","_",$name).");".NL; break; case ERROR: echo "console.error(val".preg_replace("~[^A-Z|0-9]~i","_",$name).");".NL; break; } } else { switch($type) { case LOG: echo "console.debug("".str_replace(""","\\"",$var)."");".NL; break; case INFO: echo "console.info("".str_replace(""","\\"",$var)."");".NL; break; case WARN: echo "console.warn("".str_replace(""","\\"",$var)."");".NL; break; case ERROR: echo "console.error("".str_replace(""","\\"",$var)."");".NL; break; } } } echo "".NL; } }

Код достаточно простой и понятный. Основная идея заключается в генерировании JavaScript кода, который выводит значения переменных и сообщения в консоль. Очень просто и эффективно.

Код, который содержится в секции для браузеров без консоли, создает пустые функции-заглушки и браузер будет выполнять скрипт, несмотря на присутствующие вызовы записи сообщений в консоль.

Теперь посмотрим на пример использования. Ниже приведенный код используется в демонстрационной странице:

// Включаем код для отладки и определяем объект require_once("PHPDebug.php"); $debug = new PHPDebug(); // Простое сообщение на консоль $debug->debug("Очень простое сообщение на консоль"); // Вывод переменной на консоль $x = 3; $y = 5; $z = $x/$y; $debug->debug("Переменная Z: ", $z); // Предупреждение $debug->debug("Простое предупреждение", null, WARN); // Информация $debug->debug("Простое информационное сообщение", null, INFO); // Ошибка $debug->debug("Простое сообщение об ошибке", null, ERROR); // Выводим массив в консоль $fruits = array("банан", "яблоко", "клубника", "ананас"); $fruits = array_reverse($fruits); $debug->debug("Массив фруктов:", $fruits); // Выводим объект на консоль $book = new stdClass; $book->title = "Гарри Потный и кто-то из Ашхабада"; $book->author = "Д. K. Роулинг"; $book->publisher = "Arthur A. Levine Books"; $book->amazon_link = "http://www.amazon.com/dp/0439136369/"; $debug->debug("Объект: ", $book);

Чтобы увидеть действие кода, надо открыть консоль JavaScript в браузере и открыть/перегрузить демонстрационную страницу.

В браузерах без консоли в коде появятся элементы div с сообщениями, а код выполнится до конца без перерывов.

Возможно ли узнать более детальную информацию о браузере посетителя кроме строки, содержащейся в $_SERVER[«HTTP_USER_AGENT»] : поддерживает ли яву, апплеты, таблицы стилей и фреймы? А может это вообще гуглобот зашел?
Предистория Захотелось заказчику, чтобы при заходе на сайт отображался его любимый логотип с пробегающей по нему искоркой света… Уговорить отказаться от этой идеи человека я так и не смог, но в итоге мы решили, что радость эта будет отображаться только раз, и только при заходе на главную страницу. Если человек попал на сайт с поисковика, он сразу переходит на страницу. Если он руками вписывает адрес в браузер, он перенаправляется на страницу с анимацией. После успешного отображения в куки пишется маркер, и видео больше не грузится. Но… Если на сайт зайдет не человек, а поисковик, то писать себе куки он не будет. Поэтому он всегда будет натыкаться на страницу с анимацией, и в выдаче поисковиков мы себя так и не увидим. Да и зачем поисковику логотип компании видеть:)Как можно узнать что-либо о браузере клиента Проблема в итоге была решена методом поиска подстроки имен пауков нескольких известных поисковиков в переменной $_SERVER[«HTTP_USER_AGENT»] . Но перед этим я походил по ману и обнаружил интересную функцию get_browser() . Она умеет выдавать массив параметров браузера гостя нашего сайта, назначения половины которых, правда, я так и не понял:) Единственная тонкость работы этой функции в том, что она требует наличия на хосте свежей версии файла browscap.ini , а также настройки php.ini . Очевидно что нашим ленивым (просьба не обижаться) админам влом постоянно обновлять этот файлик, так что на это обычно забивают и функция попросту недоступна. Проверить это можно, заглянув в phpinfo() , отыскав там диррективу browscap , и ничуть не удивившись что напротив нее гордо красуется надпись «no value», приступить к прочтению следующего параграфа.Что же делать Для начала нам нужен сам файл browscap.ini . Его можно скачать с http://browsers.garykeith.com/ . Может он есть и еще где-то, но данный источник рекомендуемый для скачивания самим PHP, по-этому пользуемся именно им.
Возникает вопрос: а куда нам, собственно, теперь его пристроить? Админ нас к серверу не подпустит, да и в настройках ковыряться не даст. По-этому надо бы поискать другой вариант. А их в сети нашлось целых два.
  • Browser Capabilities PHP Project - PHP5 ONLY
Тут находятся детальные и простые инструкции по запуску. Если вкратце, остается скачать нужную библиотеку, подключить в нужное место, и вызвать соответствующую функцию. Для Browser Capabilities PHP Project вызов выглядит вот так:

If(ini_get("browscap"))
{
//неленивые админы попались

/* старт шутки */
//вероятность выполнение участка кода стремится к нулю поэтому пишем сюда
echo "Начальство - ты меня задрало!";
/* конец шутки - всем смеяться:)*/

$browserInfo=get_browser();

}
else
{
//используем нашу библиотеку
require_once("browscap.php");
$bc = new Browscap("path/to/the/cache/dir");
$browserInfo=$bc->getBrowser();

В результате чего получим примерно следующее
stdClass Object
=> Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18
=> ^mozilla/5\.0 \(macintosh; .; .*mac os x.*\) applewebkit/.* \(.*\) version/3\.1.* safari/.*$
=> Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*
=> Safari 3.1
=> MacOSX
=> Safari
=> 3.1
=> 3
=> 1
=> 1
=> 1
=> 1
=> 1
=> 1
=> 1
=> 1
=> 2
=> 2
=> 1
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=> 0
=>
=> 0
)

UPD. Полученные данные свидетельствуют лишь о поддержке браузером некоторой технологии, а не о ее доступности, так как файл browscap.ini это по сути база данных всех веб-клиентов, в которой по значению User-Agent браузера предоставляется информация о поддерживаемых этим браузером технологиях. Тоесть для современных браузеров при отключенных куках и яве соответствующие параметры все равно будут возвращать еденицу.

Очень часто я слышу мнение, что через PHP невозможно узнать, какой браузер у пользователя , поскольку это серверный язык, а не клиентский. На самом деле, это далеко не так. Браузер - это клиент, а любой сервер имеет полное право знать информацию о клиенте, который к нему подключается, то есть о браузере. А как определить браузер через PHP , об этом Вы узнаете из этой статьи.

Для определения браузера пользователя в PHP есть массив $_SERVER , у которого есть элемент с ключом HTTP_USER_AGENT :

Вывод будет примерно таким: "Opera/9.80 (Windows NT 6.1; WOW64; U; ru) Presto/2.10.289 Version/12.02 ", если это Opera , либо таким: "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0 ", если клиент - это Firefox . И так далее, в любом браузере можно увидеть некое ключевое слово. Благодаря этому ключевому слову, без проблем удаётся однозначно определить браузер:

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

В разделе на вопрос Как открыть файл с расширением.php? заданный автором шеврон лучший ответ это чувак Roma2000 прогнал! Хотя если зделать как он сказал то все будет работать!
есть способ попроще! например что ты понмаешь под словом открыть? PHP ето интернет страничка.
в любом браузере в меню файл есть такой пункт открыть вот через него.
если тебе надо просмотреть внутреннею начинку то через любой текстовый редактор, например блокнот, там тоже открыть, можно вордом, но там как я непомню, тоже вроде открыть но не как www страничку а как текст.

Ответ от роспуски [гуру]
В любом браузере.


Ответ от Осоловеть [новичек]
Mozilla Firefox!


Ответ от POSTAL [новичек]
Можно ещё проще - использовать Денвер=)! Для правки кода.пхп предложил бы "Дримвивер" - лучше чем блокнот, хоумсайт и тд
ЗЫ: Papa Karlo правильно предложил.. и Roma2000 тоже. Но тебе нужно было сказать нам, для правки (изменений в коде файла) ты хочешь этот файл открыть ИЛИ визуально взглянуть "что будет", нажав на файл с расширением.пхп, так вот, всего ты не увидишь - т.к. что бы увидить что может этот.пхп-файл можно только запустив файл на сервере с "апачи" .

Эта статья также доступна на следующих языках: Тайский

  • Next

    Огромное Вам СПАСИБО за очень полезную информацию в статье. Очень понятно все изложено. Чувствуется, что проделана большая работа по анализу работы магазина eBay

    • Спасибо вам и другим постоянным читателям моего блога. Без вас у меня не было бы достаточной мотивации, чтобы посвящать много времени ведению этого сайта. У меня мозги так устроены: люблю копнуть вглубь, систематизировать разрозненные данные, пробовать то, что раньше до меня никто не делал, либо не смотрел под таким углом зрения. Жаль, что только нашим соотечественникам из-за кризиса в России отнюдь не до шоппинга на eBay. Покупают на Алиэкспрессе из Китая, так как там в разы дешевле товары (часто в ущерб качеству). Но онлайн-аукционы eBay, Amazon, ETSY легко дадут китайцам фору по ассортименту брендовых вещей, винтажных вещей, ручной работы и разных этнических товаров.

      • Next

        В ваших статьях ценно именно ваше личное отношение и анализ темы. Вы этот блог не бросайте, я сюда часто заглядываю. Нас таких много должно быть. Мне на эл. почту пришло недавно предложение о том, что научат торговать на Амазоне и eBay. И я вспомнила про ваши подробные статьи об этих торг. площ. Перечитала все заново и сделала вывод, что курсы- это лохотрон. Сама на eBay еще ничего не покупала. Я не из России , а из Казахстана (г. Алматы). Но нам тоже лишних трат пока не надо. Желаю вам удачи и берегите себя в азиатских краях.

  • Еще приятно, что попытки eBay по руссификации интерфейса для пользователей из России и стран СНГ, начали приносить плоды. Ведь подавляющая часть граждан стран бывшего СССР не сильна познаниями иностранных языков. Английский язык знают не более 5% населения. Среди молодежи — побольше. Поэтому хотя бы интерфейс на русском языке — это большая помощь для онлайн-шоппинга на этой торговой площадке. Ебей не пошел по пути китайского собрата Алиэкспресс, где совершается машинный (очень корявый и непонятный, местами вызывающий смех) перевод описания товаров. Надеюсь, что на более продвинутом этапе развития искусственного интеллекта станет реальностью качественный машинный перевод с любого языка на любой за считанные доли секунды. Пока имеем вот что (профиль одного из продавцов на ебей с русским интерфейсом, но англоязычным описанием):
    https://uploads.disquscdn.com/images/7a52c9a89108b922159a4fad35de0ab0bee0c8804b9731f56d8a1dc659655d60.png