Ответ 1
Менее известный трюк заключается в том, что mod_php отображает stderr в журнал Apache. И для этого есть поток, поэтому file_put_contents('php://stderr', print_r($foo, TRUE))
прекрасно сбрасывает значение $foo
в журнал ошибок Apache.
Я хотел бы отлаживать этот код, но я думаю, что "печать журнала на экран или файл" подходит для меня.
Как распечатать журнал в php-коде?
Обычный print/printf
, кажется, выходит на вывод HTML, а не на консоль.
У меня есть сервер Apache, выполняющий PHP-код.
Менее известный трюк заключается в том, что mod_php отображает stderr в журнал Apache. И для этого есть поток, поэтому file_put_contents('php://stderr', print_r($foo, TRUE))
прекрасно сбрасывает значение $foo
в журнал ошибок Apache.
error_log(print_r($variable, TRUE));
может быть полезно
Вы можете использовать error_log для отправки на ваш файл журнала ошибок сервера (или, если хотите, другого файла)
Если вы находитесь в Linux:
file_put_contents('your_log_file', 'your_content');
или
error_log ('your_content', 3, 'your_log_file');
а затем в консоли
tail -f your_log_file
Это будет непрерывно показывать последнюю строку, помещенную в файл.
Вам нужно изменить свое настроение. Вы пишете PHP, а не что-то еще, что вы привыкли писать. Отладка в PHP не выполняется в среде консоли.
В PHP у вас есть 3 категории отладочных решений:
Научитесь использовать их вместо того, чтобы заставить PHP вести себя как любой другой язык, к которому вы привыкли.
Вы отлаживаете консоль? Существуют различные варианты отладки PHP. Наиболее распространенной функцией, используемой для быстрой и грязной отладки, является var_dump.
Это говорит о том, что, хотя var_dump является удивительным, и многие люди делают все с этим, существуют другие инструменты и методы, который может немного подправить его.
Что нужно сделать, если отлаживать веб-страницу, оберните теги <pre> </pre>
вокруг вашего оператора дампа, чтобы обеспечить правильное форматирование массивов и объектов.
Т.е:
<div> some html code ....
<a href="<?php $tpl->link;?>">some link to test</a>
</div>
dump $tpl like this:
<pre><?php var_dump($tpl); ?></pre>
И, наконец, не в последнюю очередь убедитесь, что если отладка вашей обработки ошибок настроена на отображение ошибок. Добавление этого в начало вашего script может потребоваться, если вы не можете получить доступ к конфигурации сервера, чтобы сделать это.
error_reporting(E_ALL);
ini_set('display_errors', '1');
Удачи!
Если вы не хотите интегрировать фреймворк, например Zend, вы можете использовать trigger_error метод для входа в журнал ошибок php.
Просто путь trigger_error:
trigger_error("My error");
но вы не можете поместить массивы или объекты, поэтому используйте
var_dump
Вы можете использовать модуль php curl для вызова http://liveoutput.com/. Это отлично работает в защищенной корпоративной среде, где существуют определенные ограничения в php.ini, которые ограничивают использование file_put_contents
.
Это отличный инструмент для отладки и регистрации php: Отладчик PHP и Logger
Он работает прямо из коробки только с тремя строками кода. Он может отправлять сообщения в консоль js для отладки ajax и может заменить обработчик ошибок. Он также выдает информацию о переменных, таких как var_dump() и print_r(), но в более читаемом формате. Очень хороший инструмент!
Я использовал многие из них, но так как мне обычно нужно отлаживать при разработке, а так как я развивается на localhost, я следил за советами других и теперь пишу в консоль отладки JavaScript браузера (см. http://www.codeforest.net/debugging-php-in-browsers-javascript-console).
Это означает, что я могу посмотреть веб-страницу, которую мой PHP генерирует в моем браузере, и нажать F12, чтобы быстро показать/скрыть любую трассировку отладки.
Поскольку я постоянно смотрю на инструменты разработчика для отладчика, макет CSS и т.д., имеет смысл посмотреть на мой логгер PHP.
Если кто-то решит нам этот код, я сделал одно небольшое изменение. После
function debug($name, $var = null, $type = LOG) {
Я добавил
$name = 'PHP: ' . $name;
Это связано с тем, что PHP-сервер на стороне сервера генерирует HTML-код, кодирующий JavaScript, и мне полезно различать вывод из PHP и JS.
(Примечание. В настоящее время я обновляю это, чтобы позволить мне включать и отключать разные типы выходных данных: от PHP, от JS и доступа к базе данных)
Я использую cakephp, поэтому я использую:
$this->log(YOUR_STRING_GOES_HERE, 'debug');
Вы также можете записать в файл следующим образом:
$logFilePath = '../logs/debug.text';
ob_start();
// if you want to concatenate:
if (file_exists($logFilePath)) {
include($logFilePath);
}
// for timestamp
$currentTime = date(DATE_RSS);
// echo log statement(s) here
echo "\n\n$currentTime - [log statement here]";
$logFile = fopen($logFilePath, 'w');
fwrite($logFile, ob_get_contents());
fclose($logFile);
ob_end_flush();
Убедитесь, что установлены соответствующие разрешения, поэтому php может обращаться к файлу и записывать его (775
).
Вы можете использовать
<?php
{
AddLog("anypage.php","reason",ERR_ERROR);
}
?>
или если вы хотите напечатать этот оператор в журнале, вы можете использовать
AddLog("anypage.php","string: ".$string,ERR_DEBUG_LOW);