Php отладка ошибок

Вчера всё работало, а сегодня не работает / Код не работает как задумано

или

Debugging (Отладка)


В чем заключается процесс отладки? Что это такое?

Процесс отладки состоит в том, что мы останавливаем выполнения скрипта в любом месте, смотрим, что находится в переменных, в функциях, анализируем и переходим в другие места; ищем те места, где поведение отклоняется от правильного.


Важное замечание:

Есть много IDE и редакторов кода, которые позволяют производить отладку. Процесс настройки в них у всех различается. Поэтому стОит обратиться к документации по настройке отладки для непосредственно той среды разработки и той версии, в которой работаете именно ВЫ.

На текущий момент будет рассмотрен пример с PHPStorm 2017.


Подготовка

Для начала необходимо, чтобы в PHP имелась библиотека для отладки под названием xdebug. Если её еще нет, то надо установить.

ВАЖНО! Для очень новых версий PHP (например 8), требуется и новый xdebug, а он, в свою очередь, работает на порту 9003. Не пропустите указание правильного порта в IDE!! (Примерно в разделе PHP -> Debug -> Debug Port . Где точно — зависит от конкретной IDE)

Для WINDOWS:

скачать dll, например на xdebug.org.

Обычно все библиотеки лежат в папке ext внутри папки PHP. Туда и надо поместить dll.

Далее в php.ini прописываем настройки:

[Xdebug]
zend_extension="C:/server/php/ext/php_xdebug.dll" // <!-- тут свой путь до dll!!! Это для среды Windows. 
; Для Linux путь должен быть что-то типа zend_extension=/usr/lib/php/20151012/xdebug.so 
xdebug.default_enable = 1
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "localhost"
xdebug.remote_port = 9000
xdebug.auto_trace = 0

Перезагружаем сервер, на всякий случай.

Для UBUNTU:

  • sudo apt update ИЛИ sudo apt-get update

  • sudo apt install php-xdebug или если нужнен отладчик для конкретной версии PHP, то sudo apt install php7.0-xdebug где 7.0 указывается версия PHP

  • sudo nano /etc/php/7.0/mods-available/xdebug.ini

    вписываем строки:

     zend_extension=/usr/lib/php/20151012/xdebug.so
     xdebug.remote_autostart = 1
     xdebug.remote_enable = 1
     xdebug.remote_handler = dbgp
     xdebug.remote_host = 127.0.0.1
     xdebug.remote_log = /tmp/xdebug_remote.log
     xdebug.remote_mode = req
    

    Примечание: каталог 20151012, скорее всего, будет другим. cd в /usr/lib/php и проверьте, в каком каталоге в этом формате находится файл xdebug.so, и используйте этот путь. 7.0 — тоже отличается, в зависимости от того, какая версия у вас используется

  • Перезагружаем сервер, на всякий случай.


Теперь если в файле .php написать phpinfo(); то можно будет увидеть в самом низу такую картину:

введите сюда описание изображения

Открываем PHPStorm

  • нажимаем create project from existing files
  • выбираем Web server is installed locally, source files are located under its document root
  • выбираем папку с файлами, и нажав вверху кнопку «Project Root» помечаем папку как корень проекта
  • нажимаем «Next»
  • нажимаем Add new local server

введите сюда описание изображения

  • вводим имя сервера любое и Web Server root URL. В рассматриваемом примере это http://localhost/testy2

введите сюда описание изображения

  • нажимаем «Next» и затем «Finish»

Запуск

Для начала в левой части панели с кодом на любой строке можно кликнуть ЛКМ, тем самым поставив точку останова (breakpoint — брейкпойнт). Это то место, где отладчик автоматически остановит выполнение PHP, как только до него дойдёт. Количество breakpoint’ов не ограничено. Можно ставить везде и много.

введите сюда описание изображения

Если кликнуть ПКМ и во всплывающем меню выбрать Debug (или в верхнем меню — RunDebug), то при первом запуске PHPStorm попросит настроить интерпретатор. Т.е. надо выбрать версию PHP из папки, где он лежит, чтобы шторм знал, какую версию он будет отлаживать.

введите сюда описание изображения

Теперь можно нажать Debug!!!

В данном случае, т.к. функция вызывается сразу на той же странице, то при нажатии кнопки Debug — отладчик моментально вызовет функцию, выполнение «заморозится» на первом же брейкпойнте. В ином случае, для активации требуется исполнить действие, при котором произойдет исполнение нужного участка кода (клик на кнопку, передача POST-запроса с формы с данными и другие действия).

введите сюда описание изображения

Цифрами обозначены:

  1. Стэк вызовов, все вложенные вызовы, которые привели к текущему месту кода.
  2. Переменные. На текущий момент строки ниже номера 3 ещё не выполнились, поэтому определена лишь $data
  3. Показывает текущие значения любых переменных и выражений. В любой момент здесь можно нажать на +, вписать имя любой переменной и посмотреть её значение в реальном времени. Например: $data или $nums[0], а можно и $nums[i] и item['test']['data'][$name[5]][$info[$key[1]]] и т.д. На текущий момент строки ниже номера 3 ещё не выполнились, поэтому $sum и $output обозначены красным цветом с надписью «cannot evaluate expression».

Процесс

Для самого процесса используются элементы управления (см. изображение выше, выделено зеленым прямоугольником) и немного из дополнительно (см. изображение выше, выделено оранжевым прямоугольником).

введите сюда описание изображения

Show Execution Point (Alt+F10) — переносит в файл и текущую линию отлаживаемого скрипта. Например, если файлов много, решили посмотреть что в других вкладках, а потом забыли где у вас отладка :)

Step Over (F8) — делает один шаг, не заходя внутрь функции. Т.е. если на текущей линии есть какая-то функция, а не просто переменная со значением, то при клике данной кнопки, отладчик не будет заходить внутрь неё.

Step Into (F7) — делает шаг. Но в отличие от предыдущей, если есть вложенный вызов (например функция), то заходит внутрь неё.

Step Out (Shift+F8) — выполняет команды до завершения текущей функции. Удобно, если случайно вошли во вложенный вызов и нужно быстро из него выйти, не завершая при этом отладку.

Rerun (Ctrl+F5) — перезапускает отладку.

Resume Program(F9) — продолжает выполнение скрипта с текущего момента. Если больше нет других точек останова, то отладка заканчивается и скрипт продолжает работу. В ином случае работа прерывается на следующей точке останова.

Stop (Ctrl+F2) — завершает отладку.

View Breakpoints (Ctrl+Shift+F8) — просмотр всех установленных брейкпойнтов.

Mute Breakpoints — отключает брейкпойнты.

Итак, в текущем коде видно значение входного параметра:

  • $data = "23 24 11 18" — строка с данными через пробел
  • $nums = (4) ["23", "24", "11", "18"] — массив, который получился из входной переменной.

введите сюда описание изображения

Если нажмем F8 2 раза, то окажемся на строке 7; во вкладках Watches и Variables и в самой странице с кодом увидим, что переменная $sum была инициализирована и её значение равно 0.

Если теперь нажмем F8, то попадем внутрь цикла foreach и, нажимая теперь F8, пока не окончится цикл, можно будет наблюдать на каждой итерации, как значения $num и $sum постоянно изменяются. Тем самым мы можем проследить шаг за шагом весь процесс изменения любых переменных и значений на любом этапе, который интересует.

Дальнейшие нажатия F8 переместят линию кода на строки 11, 12 и, наконец, 15.


Дополнительно

Если нажать на View Breakpoints в левой панели, то можно не только посмотреть все брейкпойнты, но в появившемся окне можно еще более тонко настроить условие, при котором на данной отметке надо остановиться.
В функции выше, например, нужно остановиться только когда $sum превысит значение 20.

введите сюда описание изображения

Это удобно, если останов нужен только при определённом значении, а не всегда (особенно в случае с циклами).

If you’re using PHP or adopting a PHP application, you need to know how to debug in PHP. Debugging PHP errors in a production environment is one of the most frustrating things a developer can go through. Identifying the underlying cause is challenging when error reports are ambiguous.

Nobody enjoys debugging their code. However, if you want to create great web applications, you must fully complete the process.

In this guide, you will learn certain PHP debugging methods that apply to practically every programming. I’ll go over the specifics of PHP, starting with the fundamentals and working my way up to fully integrated debugging approaches.

We will cover the following:

  1. Dumping Variables to stdout
  2. Switch Error Reporting Level
  3. Monitor Error Log
  4. PHP Debugging Tools
  5. Tools to Consider for Debugging

Dumping Variables to stdout

One approach to observe what’s going on in your PHP application is to use the var_dump function.

When you don’t have any other options and need a quick way to debug PHP script, you can generally output values. This may entail running var_dump or logging a series of events.

var_dump() is a PHP native function that shows structured, human-readable data about one (or more) expressions. This is especially beneficial when working with arrays and objects, as var_dump() recursively reveals their structure, providing you the most complete picture of what’s going on. It will print the value of a variable to stdout.

You can also use additional routines to debug PHP scripts through outputs. Here are a few functions:

  • var_dump ($var) — Dumps the type and value of the variable to stdout.
  • print_r ($var) — It prints the variable value to stdout in a human-readable format.
  • get_defined_vars() — It gets all defined variables, including built-ins and custom variables (to see them, use print_r).
  • debug_zval_dump ($var) — Dumps the variable together with its reference counts. This is helpful when updating a single reference from multiple pathways.
  • debug_print_backtrace() — It prints the current function call-chain in a backtrace.
  • debug_backtrace() — It obtains a backtrace. Asynchronously, you can print_r, log it to a file, or send it to a logging endpoint.

Read this blog to learn more about these functions for PHP debugging.

Here’s some code that shows how to utilize each of these helpful debugging functions:

<?php

$myVar = "Hello!!!";
var_dump($myVar);
print_r($myVar);
$allVars = get_defined_vars();
print_r($allVars);
debug_zval_dump($allVars);

function sayHello($hello) {
    echo $hello;
    debug_print_backtrace();
}
sayHello($myVar);

?>

These functions allow you to debug your PHP code quickly.

Monitor Error Log

To debug your code, you need to know about the error. Unless you monitor the logs all day and night, you won’t know when something bad happened.

Learn How to Log to Console in PHP and Why Should You Do It.

Sending your PHP logs to a provider that will handle a few important things for you is the best option:

Many PHP logging utilities can be configured to operate with Atatus. Atatus works with PHP that handles all of these tasks for you. It also captures traces automatically—and only when it should.

You want to be able to see all of your logs in one location. If you can keep your logs and metrics in one place across all instances. You’d be able to recognize issues no matter where it occurs.

  • Traces
    It’s not only a stack dump that reveals what happened when an issue occurred. It’s also a means of monitoring performance, which is frequently a symptom or cause of a bug.
  • Deduplication of Log Entries
    When a bug generates an error, the logs can quickly fill up. It’s a show-stopper to just go through the logs and find hundreds or thousands of identical entries.
  • Alerting
    Alerting is a way to send notifications automatically about an issue to a group email or an individual. This could be due to a server problem or errors in your logs. It should be configurable, and you should be able to make changes to it.

Without a doubt, Atatus is an excellent tool for discovering bugs. However, after you’ve found them, you must correct them.

Switch Error Reporting Level

Error reporting in PHP can be configured in a few different ways. You must have access to the php.ini file to use it. You might also use the access configuration. If you can’t utilize configuration files, you can use a script to change the values. This is possible, but consider how you’d change modes after your application has been deployed.

The correct degrees of error logging can be achieved using a mix of settings. You should consider the following options:

  • error_reporting — It determines the logging level. During development, E_NOTICE is useful since it alerts you to errors such as unassigned variables.
  • display_errors — It instructs PHP on whether and where error messages should be displayed.
  • display_startup_errors — Only use it when you’re debugging.
  • log_errors and error_log — It communicates with each other to send errors to a log file. Rather of displaying them to end-users, do this in production.

The PHP manual goes over these options in greater depth and provides further information. Even if your logging settings are perfect, you must still monitor for errors.

PHP Debugging Tools

One of several debugging tools can be used to attach a debugger client to PHP code. Debug utilities such as Xdebug and ZendDebugger are supported by PhpStorm.

We are polyglots (people who know or use several languages), so we need an IDE that supports many languages. We’ve used Xdebug with Visual Studio before, so let’s see how to do it with VS Code.

The debug server is identical, but each client (IDE or CLI) has a slightly different configuration. The debug server (a Zend extension) opens a port through which the client communicates with the server. It’s merely a matter of setting up the right components and installing them.

The following are the steps to programming in PHP:

  • In VS Code, look for PHP extensions.
  • Install the PHP Debug extension to your PHP configuration.
  • Click “Reload” to reload VS Code.
  • Install the Xdebug program. The PHP Debug extension for VS Code is limited to Xdebug integration. If we install PHP 7.0, the correct version of Xdebug must be downloaded from the download page.
<?php
   phpinfo();
?>
  • Put it in the PHP/ext directory once you’ve found the proper version.
  • The next step is to set up PHP to use the extension and enable remote debugging. In the php.ini file provided in PHP Info, add the following configuration:
; set the extension path
zend_extension="/absolute/path/to/xdebug.so"

; allow remote debugging
[XDebug]
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
  • It will configure the PHP server to work with XDebug. No matter which IDE you use, the processes are the same.
  • Xdebug creates an HTTP port for your debugger to connect to. The client must still be set to connect to the server and utilize the debugging protocol.
  • Finally, set up VS Code to connect with Xdebug. After a few simple steps, the attachment is completed automatically.

Configuring Your IDE

You must configure IDE to attach to the debugger after installing Xdebug. This is equivalent to adding a debug configuration in Visual Studio Code. Fortunately, it is automatic and only a few simple steps are required:

  • Switch to the debug mode.
  • The languages menu will appear when you click the gear.
  • Choose PHP. The default configuration will be generated by Visual Studio Code.
  • The PHP server should be reloaded. We’ll need to install a third-party extension called «PHP Server» to make this easier. To control the PHP server, use the context menu (right-click).
  • It puts the IDE in a position where it can connect to Xdebug. A TCP port on the debug server is used to communicate with the debugger. By default, Xdebug uses the DBGp protocol via port 9000.

Attaching a Debugger

We’ve installed a debugging extension and configured our IDE. It’s now time to connect to the debugger.

A launch.json file was generated by the PHP Debug plugin for VS Code. That file is placed in the project’s root .vscode directory. Here’s what it resulted in:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [{
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000
        }
    ]
}

It’s going to add two new launch configurations. These can be found in the debug view. With the current script, we can either connect to an existing server or start a new one. Since I already have phpinfo running, I’ll begin by selecting Listen for XDebug to connect to that server.

The debug toolbar will appear once you’ve been connected.

A control mechanism can be found in most debuggers. You can use this to start, stop, step, and restart your debugger. We’re connected and ready because we see a stop and pause icon, so let’s get stepping.

Setting PHP Breakpoints

The first step is to create a php breakpoint where you believe there is an issue. We normally plug one in right before we enter the problem code so we can see what’s going on. To get things started, let’s add one to the phpinfo script.

By clicking in the left margin, you may usually set a breakpoint on the next line. Alternatively, place your cursor on the line and press F9. If you have many function calls on the same line, this is a good approach to make sure the php breakpoint is set on the right one. In the left margin, a red dot should emerge. This is an example of a breakpoint. It should also appear in the «breakpoints» section.

We’re still looking at things in Debug view. One php breakpoint was set. You can now right-click the red breakpoint circle in the margin next to the code and select Edit breakpoint. Conditions come in handy when you have a large collection but only one element is causing a problem. Conditionals are something we use all the time.

You can log a message and break after a particular number of hits, in addition to conditional breakpoints. When you have code that repeats without a specific unique value to break on, the latter is useful.

For example, you may have code that renders components in a collection. You can simply set the hit count to 13 if the 13th component produces a disaster. We’ve had to manually count too many times to notice how useful this feature is.

Tools to Consider for Debugging

Finally, we’d like to highlight a handful of useful tools that we’ve found beneficial in the debugging process. We won’t go into great detail about how to install and configure these extensions and add-ons, but we wanted to bring them up because they can make our life so much easier.

  1. Xdebug
    Xdebug is a PHP extension that seeks to make the process of debugging your applications a little easier. Xdebug is extremely customizable and adaptable to a wide range of scenarios. Stack traces, for example, can be set to four different levels of detail. This means you can change the sensitivity of Xdebug’s output to acquire more detailed information about your application’s behavior.
  2. FirePHP
    FirePHP is a PHP library and Firefox add-on that can be extremely beneficial when working with AJAX. Essentially, FirePHP allows you to use a single method call to log debug information to the Firebug console. All data logged to the Firebug console is sent via response headers, so it does not affect how the browser renders the website.

Conclusion

In this article, we’ve covered a lot. It’ll be enough to get you started debugging PHP. This is a complex subject, but the best way to learn is to practice. You’ll develop a reputation as a bug exterminator extraordinaire if you practice debugging until you’ve mastered the technique.

Hopefully, you’ve learned how to debug in PHP, use var_dump(), and more. Similarly, I hope you will find Xdebug and FirePHP beneficial and that they will make your development cycle easier.


Atatus:
PHP Performance Monitoring and Log Management

Atatus is a Full Stack Observability Platform that collects all requests to your PHP applications without requiring you to change your source code. However, the tool does more than just keep track of your application’s performance. It monitors logs from all of your PHP applications and systems into a centralized and easy-to-navigate user interface, allowing you to troubleshoot faster.

We give a cost-effective, scalable method to centralized PHP logging, so you can obtain total insight across your complex architecture. To cut through the noise and focus on the key events that matter, you can search the logs by hostname, service, source, messages, and more. When you can correlate log events with APM slow traces and errors, troubleshooting becomes easy.

Try your 14-day free trial of Atatus.

Отладка программ

Курс PHP для начинающих

  • PHP и MySQL
  • Основы PHP
  • Отладка программ

Внимание! Данный курс устарел!
Переходите к новому курсу «PHP для начинающих».

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

Количество инструментальных средств отладки достаточно велико. Не в последнюю очередь такая ситуация объясняется тем, что в приложениях PHP обычно используются возможности нескольких серверов (таких как сервер HTTP и сервер, входящий в состав системы управления базами данных), а в комплект каждого из таких серверов обычно входят собственные компоненты ведения журналов и формирования сообщений об ошибках, с помощью которых эти серверы предоставляют своим пользователям возможность следить за происходящим.

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

Кроме встроенных средств формирования сообщений об ошибках языка PHP и технологий, поддерживаемых этим языком, программисты, работающие на языке PHP, в последнее время получили возможность использовать такие же разновидности инструментальных средств отладки, которые в течение многих лет находились в распоряжении программистов, работающих на других языках. Основной среди этих инструментальных средств является среда отладки Zend, которая позволяет контролировать значения переменных, устанавливать точки прерывания и обеспечивать пошаговое выполнение программ с любой желаемой скоростью. В этой статье среда отладки Zend не рассматривается, но ее описание и другие дополнительные сведения можно найти по адресу www.zend.com.

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

Курс PHP для начинающих

Общие стратегии поиска неисправностей

Двумя основными составляющими всей деятельности по отладке являются обнаружение причин нарушения в работе и последующее их устранение (без нарушения функционирования чего-либо иного под воздействием побочных эффектов реализации принятого решения). Это утверждение остается справедливым независимо от того, осуществляется ли диагностика программы PHP, телефонного коммутатора, электронной схемы или автомобиля «Копейка», — определенные принципы остаются в силе, о какой бы рассматриваемой проблемной области не шла речь. Всегда руководствуйтесь таким подходом, пытаясь выяснить, в чем причина нарушений в работе рассматриваемого программного обеспечения.

Внесение изменений только в одном месте

При проведении любых экспериментов необходимо руководствоваться основным правилом: если функционирование рассматриваемого объекта зависит от многочисленных факторов, то невозможно заранее узнать со всей определенностью, чем вызван какой-то конкретный сбой. Поэтому всегда следует вносить только одно изменение, затем проверять полученные результаты и определять, удалось ли устранить нежелательное поведение объекта. В случае отрицательного ответа необходимо внести еще одно изменение (возможно, полностью отменив внесенное перед этим изменение).

Ограничение области проявления проблемы

Если удастся свести поиск причин проблемы до единственной библиотеки или функции, это можно рассматривать как значительный успех в процессе поиска источника проблемы. Используйте специальные вызовы функций echo() и print_r() для своевременного вывода информации трассировки. Это позволяет определить тот момент, когда возникают изменения, являющиеся причиной нарушения в работе, и в какое время переменные приобретают такие значения, которые не должны были содержать.

Кроме того, для контроля над функционированием программ и за поведением компонентов программ в ходе их функционирования можно использовать отладчик с графическим интерфейсом (такой как Zend Studio).

Упрощение и последующее усложнение

Эта рекомендация может показаться очевидной, но о ней часто забывают. Если приходится сталкиваться с нарушениями в работе, связанными с использованием какой-то конкретной функции или средства, соответствующий компонент необходимо исключить из программы (либо заменив фиктивным вызовом, либо обозначив комментариями) и проверить, позволяет ли это добиться нормального функционирования программы. Еще один вариант состоит в том, чтобы заменить динамические данные статическими данными (например, вместо получения данных с помощью запроса к базе данных применить простые операторы присваивания значений переменным). Добейтесь успешного функционирования программы в наиболее упрощенных условиях, а затем поэтапно усложняйте программу, каждый раз проводя проверку, чтобы узнать, на каком этапе обнаруживаются ошибки.

Документирование принятых решений

Такая ситуация встречается слишком часто: программист часами отыскивает причину ошибки (или даже откладывает эту работу на следующий день) и наконец находит решение. Не следует после этого сразу же отправляться праздновать победу. Найдите время, чтобы отразить в комментариях к программе то, в чем состояла ошибка и каковым является решение. Это позволит вам быть во всеоружии, если снова возникнет та же проблема, а она непременно возникнет.

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

Нередко встречается такая ситуация, когда устранение проблемы в одном компоненте приводит к нарушению в работе какого-то другого компонента. Именно поэтому необходимо еще раз проверить систему, чтобы убедиться в ее нормальной работе не только в том месте, где была первоначально обнаружена ошибка, но и во всех других местах, где могут возникнуть нарушения. Данная рекомендация позволяет также понять, почему так важно ограничивать область действия ошибок в максимально возможной степени, — это дает возможность уменьшить объем необходимого повторного тестирования.

Курс PHP для начинающих

Общая классификация ошибок

Программистам приходится сталкиваться с весьма разнообразными ошибками. Некоторые ошибки являются не только простыми по своему характеру, но и легко обнаруживаемыми (к ним относятся синтаксические ошибки и ошибки, связанные с неправильным написанием). Задача поиска других ошибок является намного более сложной, поэтому рекомендации, приведенные в этом разделе, помогут многим программистам.

Ошибки на этапе компиляции

Язык PHP является компилируемым, но компиляция программы осуществляется непосредственно перед ее выполнением, поэтому сам процесс компиляции не столь очевиден, как в языке C или Java.

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

Ошибки этапа выполнения

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

Логические ошибки

По-видимому, логические ошибки относятся к категории ошибок, наиболее трудно поддающихся обнаружению. А если первоисточником подобной ошибки является неправильное понимание программистом каких-то аспектов решаемой задачи, то такая ошибка очень сложно поддается исправлению.

Предположим, перед программистом поставлена задача обеспечить запуск космического зонда и вывести его на орбиту вокруг Марса. Программист из США предусмотрел в своем навигационном алгоритме получение входных данных в фунтах и дюймах, но требуемые данные поступают из европейского центра управления полетами в метрической системе. Очевидно, что при таких условиях космический зонд непременно врежется в марсианскую поверхность. Программное обеспечение действовало в полном соответствии с заданием, но, строго говоря, при таких условиях задание предусматривало вывод ракеты прямо на Марс. Это — логическая ошибка.

Из этого следует, что необходимо добиться того, чтобы программа не просто вырабатывала выходные данные, но вырабатывала их правильно. Воспользуйтесь отдельно взятой процедурой расчетов и убедитесь в том, что формируемые программой результаты являются правильными; еще один вариант состоит в том, что результаты программы должны сравниваться с заведомо известными правильными значениями. А для того чтобы не попадать в неприятную историю, не пишите программы на языке PHP для космических кораблей ;).

Курс PHP для начинающих

Использование журналов веб-сервера

Эксплуатация большинства программ PHP приводит к получению HTML-страниц того или иного рода, а эти страницы, в свою очередь, передаются пользователю с помощью HTTP-сервера, такого как Apache или Microsoft Internet Information Server (IIS). Это означает, что дополнительным источником ошибок может стать программное обеспечение веб-сервера. По этой причине важно знать, какой способ применяется в веб-сервере для формирования и регистрации сообщений об ошибках, а также знать о том, как получить доступ и провести синтаксический анализ журналов, в которых регистрируются ошибки.

Сервер Apache

На HTTP-сервере Apache ведутся два файла журнала в формате открытого текста. Эти журналы описаны ниже:

Apache/logs/access.log

Предназначен для регистрации каждого запроса на получение файла, передаваемого по протоколу HTTP. К регистрируемым данным относятся дата, время и полученные результаты (успешное или неудачное завершение, о чем можно судить по числовому коду состояния). Этот журнал представляет собой также журнал регистрации доступа, в котором фиксируется IP-адрес, из которого поступил каждый запрос.

Apache/logs/error.log

Это — журнал регистрации ошибок, в котором фиксируются только ситуации, связанные с возникновением ошибок.

Унифицированный формат журнала

По умолчанию для оформления записей в файле error.log сервера Apache используется унифицированный формат журнала, который принят в качестве стандартного. В этом формате каждая запись соответствует отдельному экземпляру действия, касающегося запроса и/или ответа (в конечном итоге HTTP-серверы занимаются обработкой именно запросов и ответов). Например, одна строка журнала может соответствовать запросу на получение HTML-страницы (и содержать сведения о том, в каких обстоятельствах эта страница была впоследствии предоставлена сервером Apache). А следующая строка может описывать (автоматическое) выполнение запроса и передачу файла JPEG, связанного с ранее затребованным документом HTML.

В любом случае записи в унифицированном формате журнала выглядят примерно так, как показано ниже (в действительности каждая запись занимает только одну строку):

127.0.0.1 - - [12/Jan/2013:03:18:33 +0800] "GET /images/lang.gif HTTP/1.1" 200 6590

Ниже перечислены наиболее важные компоненты данной строки:

  • 127.0.0.1. IP-адрес клиента, от которого поступил запрос по протоколу HTTP (в данном случае локальный хост).

  • [12/Jan/2013:03:18:33 +0400]. Дата, время и разница между временем текущего часового пояса и всеобщим скоординированным временем (Universal Coordinated Time — UTC).

  • GET. Тип запроса HTTP — GET или POST.

  • /images/lang.gif. Затребованный файл.

  • HTTP/1.1. Версия протокола HTTP, используемого для передачи запроса.

  • 200. Код ответа, описывающий результат запроса (дополнительная информация на эту тему приведена ниже в данном разделе).

  • 6590. Количество байтов, переданных в ответе HTTP, соответствующем этому запросу.

Коды ответов HTTP

Количество кодов ответов HTTP весьма велико (хотя самым знаменитым остается код сообщения об ошибке «404 Not Found»), но сами эти коды подчиняются общему шаблону, с помощью которого можно быстро узнать назначение каждого кода. По существу, данные шаблоны подразделяются на категории, описанные ниже:

  • Коды ряда 200 указывают на успешное завершение.

  • Коды ряда 300 обозначают перенаправление.

  • Коды ряда 400 указывают на клиентскую ошибку (подобную указанию в запросе несуществующего документа).

  • Коды ряда 500 указывают на серверную ошибку.

Полный список кодов ответов HTTP приведен по адресу www.w3.org/Protocols/rfc2616/rfc2616-sec10.html.

Сервер IIS

В HTTP-сервере IIS компании Microsoft задача ведения журнала осуществляется иначе. Сервер IIS не записывает журнал в файл, а регистрирует полученную им информацию о состоянии и об обнаруженных ошибках таким образом, чтобы эта информация была доступна для исследования в программе Event Viewer. Ошибки, зарегистрированные сервером IIS, можно найти в части System Log окна Event Viewer, где для обозначения источника применяется имя W3SVC.

Курс PHP для начинающих

Неоценимую помощь при выявлении ошибок может оказать сам интерпретатор PHP. Даже без какой-либо дополнительной настройки система PHP способна выводить сообщения об ошибках вместе с выходными данными. Эти сообщения передаются прямо в окно браузера вместе с номерами строк. Для большинства программистов этих сведений вполне достаточно, чтобы можно было воспользоваться самим интерпретатором PHP как средством отладки, но, чтобы получить максимум пользы от этих средств, важно знать все нюансы настройки конфигурации, от которых зависят условия формирования сообщений об ошибках.

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

Формирование сообщений об ошибках

Выполняемая интерпретатором PHP операция включения сообщения об ошибке в вывод программы (что чаще всего приводит к отображению сообщения об ошибке в окне браузера) по существу представляет собой операцию формирования сообщения об ошибке. Формирование сообщений об ошибках является полезным диагностическим инструментальным средством, использование которого разрешено по умолчанию. Если же интерпретатор PHP подключен к серверу производственного назначения, то данное средство должно быть запрещено.

Чтобы разрешить или запретить формирование сообщений об ошибках, необходимо внести изменение в файл php.ini. При этом корректировка применяется к параметру display_errors. Если требуется, чтобы сообщения выводились в составе формируемых выходных данных, то в файле php.ini должна присутствовать следующая строка:

display_errors=On

Если же сообщения об ошибках не должны отображаться (и это действительно не допустимо, если сервер используется для предоставления к нему общего доступа), то соответствующая строка должна выглядеть таким образом:

display_errors=Off

Игнорирование данной рекомендации при эксплуатации сервера производственного назначения приводит к тому, что функционирование средств формирования сообщений об ошибках вызовет непреднамеренное раскрытие перед пользователями важных сведений об организации программного обеспечения. Например, какое-либо непредвиденное условие может вызвать появление в окне незащищенного браузера имени переменной или таблицы базы данных. А потенциальный нарушитель сможет воспользоваться этой информацией для несанкционированного доступа к серверу.

Регистрация ошибок

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

Как и в случае средств формирования сообщений об ошибках, применение средств регистрации ошибок может быть разрешено или запрещено с помощью файла php.ini. Чтобы разрешить использование этих средств, необходимо применить следующую опцию:

log_errors=On

В противном случае следует задать такую опцию:

log_errors=Off

По умолчанию средства регистрации ошибок запрещены в файле php.ini.

Определение категории ошибок, подлежащих выводу на экран или записи в журнал

Принимая решение об использовании средств формирования сообщений об ошибках (для вывода на экран) или средств регистрации ошибок (для записи в файл), необходимо дополнительно указать, какие ошибки рассматриваются как достаточно серьезные для предоставления информации о них пользователю. Параметры настройки средств ведения журнала задаются в файле php.ini с помощью значения параметра error_reporting. По умолчанию параметру error_reporting присваивается следующее значение:

error_reporting=E_ALL & ~E_NOTICE

Такая настройка указывает, что пользователю должна предоставляться информация обо всех ошибках и предупреждениях (что показывает параметр E_ALL), но вместе с тем действует условие (что показывает оператор &), согласно которому извещения этапа прогона не подлежат выводу (для этого служит параметр ~E_NOTICE, где ~ представляет собой оператор отрицания).

Степень серьезности отображаемых сообщений об ошибках, которая определена параметром error_reporting, отражается на поведении средств регистрации ошибок (если их использование разрешено с помощью параметра log_errors=On) и средств формирования сообщений об ошибках (если их использование разрешено с помощью параметра display_errors=On) или одновременно тех и других средств, если все они разрешены.

Курс PHP для начинающих

Функции формирования сообщений об ошибках

Язык PHP не только в значительной степени упрощает работу программистов, но и включает в себя широкий набор функций, которые могут использоваться программистами для облегчения поиска причин нарушений в работе и в целом для получения сведений обо всех аспектах состояния разрабатываемых ими программ. Спектр таких средств начинается с обычных операторов формирования вывода (print, echo и тому подобных), используемых в тех контекстах, когда требуется контролировать значения переменных, и заканчивается специализированными функциями, осуществляющими вывод данных с помощью механизмов ведения журналов операционной системы.

В настоящем разделе даны вводные сведения о некоторых функциях PHP, которые позволяют выявлять причины проблем и создавать отчеты об условиях функционирования программ.

Диагностические операторы вывода

Простейший метод устранения нарушений в работе предусматривает размещение в ключевых местах кода операторов echo и print, для того чтобы формируемые выходные данные содержали информацию о ходе выполнения программы, осуществляемого на основе вызова различных функций, а также о том, какие значения принимают наиболее важные переменные в различных точках.

Использование таких средств можно сравнить с применением простейшего отладчика, поскольку операторы вывода позволяют отслеживать значения переменных во время выполнения программы и следить за тем, не происходит ли присваивание этим переменным каких-либо непредусмотренных значений (и в случае положительного ответа на этот вопрос позволяют узнать, когда это происходит).

Использование функции var_dump()

Обычные функции вывода являются довольно удобными, но с точки зрения отладки более специализированные функции может оказаться гораздо полезнее. Наиболее важной среди функций подобного типа является функция var_dump(). Она может рассматриваться как чрезвычайно «остроумный» оператор вывода, который, кроме всего прочего, автоматически представляет содержимое любого массива в таком виде, который очень удобен для восприятия человеком.

Напомним, что выполнение приведенного ниже кода приводит к получению результатов, от которых мало пользы:

Код PHP

$fruit = array('orange' => 'Апельсин',
			   'red' => 'Яблоко',
			   'yellow' => 'Банан',
			   'green' => 'Груша');
echo $fruit;

Данные результаты сводятся к следующему:

Использование конструкции echo для вывода массива

Это нам ничего не дает. С другой стороны, если за определением того же массива следует строка

Код PHP

var_dump($fruit);

то формируется следующие намного более полезные выходные данные:

Использование функции var_dump() для вывода массива

На основании таких данных программист, занимающийся отладкой, может немедленно определить, каково содержимое данного массива (чему равны ключи и значения элементов этого массива).

Использование функции syslog()

В языке PHP предусмотрена функция syslog(), которая позволяет осуществлять запись непосредственно в журнал операционной системы, под управлением которой функционирует среда PHP. Это удобная функция, которая становится особенно полезной, если требуется регистрировать всю информацию о проблемах, возникающих в системе, с помощью стандартных средств, или есть необходимость предупредить о нарушении в работе системного администратора, если он непосредственно не соприкасается с разработками на языке PHP.

В целом функция syslog() позволяет указать степень серьезности, связанную с регистрируемым событием, а также ввести сообщение, которое описывает это событие. Затем указанные значения могут быть выведены в журнал для использования в качестве вспомогательной информации для диагностики.

Все возможные опции определения степени серьезности функции syslog() показаны в следующем коде:

Код PHP

$logOptions = array(LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING,
                LOG_ERR, LOG_CRIT, LOG_ALERT, LOG_EMERG);
				
$msg = array('Сообщение отладки', 'Информация', 'Уведомление', 'Предупреждение', 
                'Ошибка', 'Критическая ошибка', 'Серьезная ошибка', 'Кабздец');

foreach($logOptions as $key => $value) {
	syslog($value, $msg[$key]);
}

В системе Microsoft Windows первые три из этих сообщений об ошибках (от LOG_DEBUG до LOG_NOTICE) рассматриваются как информационные, четвертое и пятое считаются предупреждающими, а последние три отмечаются в программе Event Viewer как относящиеся к категории Alerts. Все эти сообщения отображаются со значением источника c-client, которое соответствует одному из вспомогательных процессов сервера Apache:

Сообщения об ошибках с различными степенями серьезности в программе Event Viewer

Использование функции error_log()

Функция error_log() может использоваться для передачи сообщения об ошибке почти в любое место назначения, включая адрес электронной почты. Эта функция предоставляет легкий и удобный способ формирования отчета о непредвиденных условиях, возникших в процессе функционирования программного обеспечения PHP, но, к сожалению, этим средством пользуются лишь немногие разработчики. Более подробно она описана в предыдущей статье в разделе «Ведение журнала и отладка».

Нарушения в работе системы PHP

Безопасность

Оценить статью:

Here are some examples of error reporting:

  • If you use an invalid syntax, PHP generates an Error and stops the script execution.
  • If a database connection fails, PHP generates a Warning (and the script execution continues).
  • If you misspell a variable or if you use an invalid array index, PHP generates a Notice (and the script execution continues).

Now, here is the thing.

You do not want to show these messages in production, because they can mess with the output HTML.

Moreover, such messages may help attackers gain information about your system (I explain exactly how to avoid this and similar security issues in my PHP Security course).

However, they are very useful for debugging purposes.

So, you want to be able to see those messages but, at the same time, you want to hide them from remote users.

It may seem complicated, but you can do that in three simple steps.

Step 1: enable error reporting

First, make sure error reporting is enabled.

Search for the error_reporting directive in your php.ini file.

This directive enables error reporting for specific message types. The most common setting, which is also the one I recommend, is the following one:


error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

This is the default setting on many installations. Translated into English, it says: “Enable error reporting for all message types, except for deprecated and strict”.

You can use the above setting safely.

If your setting is different and you prefer to keep it that way, feel free to share it in the comments and I’ll tell you what it does.

If you don’t have access to your php.ini file, you can enable error reporting at runtime directly from your PHP scripts by using the error_reporting() function.

You have to do that for each script where you want to enable error reporting.

For example, the following statement has the same effect of the previous php.ini directive, but only for the script where it’s executed:

<?php
/* Enable error reporting for all types except for deprecated and strict. */
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
/* ... */

Step 2: turn off HTML error output

The error_reporting directive is the “master switch” for error reporting.

In addition to that, you also need to tell PHP where debugging messages (Errors, Warnings and Notices) are going to be sent.

PHP can send debugging messages to:

  • The PHP error log file
  • The scripts HTML output

The first option, the error log, can be useful and does not have security implications. Therefore, it’s a good idea to enable it. You can do that by setting this php.ini directive:

log_errors is usually enabled by default.

The second option makes debugging messages appear in the scripts HTML output. As we mentioned earlier, enabling this option is not a good idea, so be sure to disable it.

To do it, you need to set the display_errors directive to Off in your php.ini file:

Now, debugging messages are saved to the PHP error file only. This is the standard production configuration.

But you don’t have to use the log file to debug your scripts.

In step #3, I’ll show you how to display debugging messages in the HTML output only for yourself, without affecting regular users.

Step 3: enable HTML error output only for yourself

Even if you disabled HTML error reporting in your php.ini (by disabling the display_errors directive), you can still enable it at runtime by using the ini_set() function.

Again: you don’t want to do that always, but only for yourself. So, you need to do that conditionally.

There are four different ways to do that:

  • By making a copy of the script to debug it
  • By using your IP address as filter
  • By using a specific user
  • By using a request parameter

Option #1 make a copy of the script

This is the simplest solution.

You just need to copy the script you want to debug to a different location (better if private) and add the ini_set() statement at the beginning.

This is the ini_set() syntax to enable the HTML error reporting:


<?php
/* Enable HTML error reporting. */
ini_set('display_errors', '1');

Then, you can work on the copy of the script where you can see the debug messages.

Once you have found the problem, you can fix the original script.

Option #2: use your IP address

If you have a static IP address, you can decide whether display error messages depending on the page viewer’s IP.

For example, let’s say that your static IP address is 1.1.1.1

This is how you can enable HTML error reporting only when the script is executed by that IP:


<?php
/* Your IP. */
$myIP = '1.1.1.1';
/* Check the request IP address. */
if ($_SERVER['REMOTE_ADDR'] == $myIP)
{
  /* Enable HTML error reporting. */
  ini_set('display_errors', '1');
}

Option #3: use a specific user

If you are debugging an authentication-based PHP application, you can create a specific user for debugging purposes.

For example, let’s say that you are using my Account class. You can create the “debug” user and enable HTML error reporting only for that account.

This is how to do it:


<?php
/* Include the Account class. */
include 'account_class.php';
/* Authentication steps... */
$account = new Account();
/* ... */
/* Check the user name. */
if ($account->getName() == 'debug')
{
  /* Enable HTML error reporting. */
  ini_set('display_errors', '1');
}

This works for any authentication system. You just need to use the right syntax for the system you are using.

Option #4: use a request parameter

If none of the previous solutions work for you, you can use a request parameter as debug switch.

For example, the following code enables HTML error reporting only if the “enable_debug” request parameter is set to “1”:


<?php
/* Check if the "enable_debug" request parameter is set and its value is "1". */
if (isset($_REQUEST['enable_debug']))
{
  if ($_REQUEST['enable_debug'] == '1')
  {
    /* Enable HTML error reporting. */
    ini_set('display_errors', '1');
  }
}

Note that any page visitor who knows the request parameter can enable HTML error messages.

Variable debugging

PHP error reporting is useful to check if something is wrong with the code syntax.

However, you often need to look at your variables to fix your script. This is where variable debugging comes into play.

The simplest way to check the value of a variable is to “echo” it. For example, in the following code you can echo the $domain variable to make sure it is correct:


$addr = 'www.google.com';
$domain = mb_substr($addr, mb_strpos($addr, '.') + 1);
/* Is $domain correct? */
echo $domain;

When debugging your variables, you want to restrict the debug output to yourself, just like for HTML error reporting.

You can use the same techniques you learned in the previous chapter for variables debugging too: making a copy of the script, using your IP address, using a specific user, or using a request parameter.

For example, this is how to echo the $domain variable only when accessing the page as the debug user:


<?php
/* Include the Account class. */
include 'account_class.php';
/* Authentication steps... */
$account = new Account();
/* ... */

$addr = 'www.google.com';
$domain = mb_substr($addr, mb_strpos($addr, '.') + 1);
/* Check the user name. */
if ($account->getName() == 'debug')
{
  /* Debugging. */
  echo $domain;
}

get_defined_vars()

“echo” works fine as long as you know which variable you need to check.
However, sometimes you need to check all the variables in your script.
To do that, you can use the get_defined_vars() function.

get_defined_vars() returns an array with all the variables defined up to that moment.

This is how you use it:


$addr = 'www.google.com';
$dotPos = mb_strpos($addr, '.');
$domainPos = $dotPos + 1;
$domain = mb_substr($addr, $domainPos);
/* Debug. */
echo '<pre>';
print_r(get_defined_vars());
echo '</pre>
<p>';</p>
<p>

get_defined_vars() shows both user defined variables (like $addr, $dotPos, etc.) and system variables, including $_SERVER and the request string arrays ($_POST, $_GET…)

This makes get_defined_vars() a very powerful debugging tool.

This is the output from the above example (I removed some elements for the sake of readability):


Array
(
    [_GET] => Array
        (
        )
    [_POST] => Array
        (
        )
    [_COOKIE] => Array
        (
        )
    [_FILES] => Array
        (
        )
    [_REQUEST] => Array
        (
        )
    [_SERVER] => Array
        (
            [MIBDIRS] => C:/xampp/php/extras/mibs
            [MYSQL_HOME] => xamppmysqlbin
            [OPENSSL_CONF] => C:/xampp/apache/bin/openssl.cnf
            [PHP_PEAR_SYSCONF_DIR] => xamppphp
            ....
            [PHP_SELF] => /test.php
            [REQUEST_TIME_FLOAT] => 1595999862.718
            [REQUEST_TIME] => 1595999862
        )
    [addr] => www.google.com
    [dotPos] => 3
    [domainPos] => 4
    [domain] => google.com
)

Note:

get_defined_vars() shows all the variables defined in the current scope.

If you need to debug a function or a class method, you need to call get_defined_vars() from within the function or method.

For example:


function myFunction($arg1, $arg2, $arg3)
{
  $var1 = $arg1 + $arg2;
  $var2 = $arg1 * $arg2;
  $arrayVar = [$arg1, $arg2, $arg3, $var1, $var2];
  
  /* This prints all the variables in the current scope. */
  echo '<pre>';
  print_r(get_defined_vars());
  echo '</pre>
<p>';<br />
}</p>
<p>/* Call myFunction() */<br />
myFunction(5, 10, 15);</p>
<p>

In this case, the output from get_defined_vars() will include the variables available inside myFunction():


Array
(
    [arg1] => 5
    [arg2] => 10
    [arg3] => 15
    [var1] => 15
    [var2] => 50
    [arrayVar] => Array
        (
            [0] => 5
            [1] => 10
            [2] => 15
            [3] => 15
            [4] => 50
        )
)

Function debugging: backtraces

A function backtrace gives you the history of the function calls.

While variables debugging shows you a «photograph» of the current situation (showing the current values of all the script variables), a function backtrace shows you what the script has done to get there.

More specifically, it shows you all the function calls from the beginning of the script execution up to the moment the backtrace is shown.

You can get a function backtrace by using the debug_backtrace() function.

Let’s see an example:


function f1(int $arg)
{
  $a = f2($arg + 1);
  $b = $a + 2;
  return $b;
}

function f2(int $arg)
{
  $a = f3($arg);
  $b = $a * 3;
  
  return $b;
}

function f3(int $arg)
{
  $a = $arg * 10;
  
  echo '<pre>';
  print_r(debug_backtrace());
  echo '</pre>
<p>';</p>
<p>  return $a;<br />
}</p>
<p>$val = f1(5);</p>
<p>

Here, you call f1() that in turn calls f2() that in turn calls f3().

If you ask for a function backtrace inside f3(), like in the example, you can see all the function calls that have been made to get there.

This is the output from debug_backtrace():


Array
(
    [0] => Array
        (
            [file] => C:xampphtdocstest.php
            [line] => 15
            [function] => f3
            [args] => Array
                (
                    [0] => 6
                )
        )
    [1] => Array
        (
            [file] => C:xampphtdocstest.php
            [line] => 6
            [function] => f2
            [args] => Array
                (
                    [0] => 6
                )
        )
    [2] => Array
        (
            [file] => C:xampphtdocstest.php
            [line] => 33
            [function] => f1
            [args] => Array
                (
                    [0] => 5
                )
        )
)

Here’s how it works:

debug_backtrace() returns an array. Each element of this array is a function call. The first element of this array is the last function call (f3() in the example), and the last element of the array if the first function call (f1() in the example).

Each array element contains:

  • the file from where the function has been called (C:xampphtdocstest.php). If the function has been called from an included file, this element contains the included file path;
  • the line where the function call has been made (15 in the first element);
  • the function name (f3 in the first element);
  • the list of the function arguments, as an array. For example, the last function call shown in the first array element has the number 6 as only argument.

You can also use the debug_print_backtrace() function as an alternative to debug_backtrace().

There are two main differences between these functions:

  • debug_print_backtrace() shows the function calls as text lines, instead of array elements.
  • debug_print_backtrace() echoes the output automatically, so you don’t have to use print_r().

This is how to use debug_print_backtrace() in the f3() function:


function f3(int $arg)
{
  $a = $arg * 10;
  
  echo '<pre>';
  debug_print_backtrace();
  echo '</pre>
<p>';</p>
<p>  return $a;<br />
}</p>
<p>

#0  f3(6) called at [C:xampphtdocstest.php:15]
#1  f2(6) called at [C:xampphtdocstest.php:6]
#2  f1(5) called at [C:xampphtdocstest.php:33]

Function backtraces are very useful when you want to see if your code logic works es expected.

By looking at every backtrace step, you can see exactly what your script has done to get to that point, including the values of every function argument.

How to log your debug data

So far, you have seen how to display debug data in the scripts HTML output.

Now, let’s see how to save that data to a log file.

Logging your debug data has three advantages:

  1. You can keep your debug results for longer, without having to keep the browser open.
  2. You don’t need to apply any technique to hide debugging data from users.
  3. You can log the actual users’ activity, instead of just your own tests.

The last point is particularly important. By logging debug information as your PHP scripts are executed, you can see how your scripts work in production with real user data. Without logging, you are limited to your own tests.

There are a few different ways you can write a log file with PHP. Here, I will show you the easiest.

To write to a log file, you first need to open it with fopen(). For example, let’s say that you want to save your debug data into c:xamppdebug.log:


/* Open the log file. */
$handle = fopen('c:xamppdebug.log', 'ab');

The first argument of fopen() is the path of the log file.

The second argument contains the opening flags. In particular, «a» tells fopen() to append new data to the file (you don’t want to erase your log file every time), and «b» avoids automatic newline conversion.

Note: be sure that the file you choose can be written by PHP.

Now, a good idea is to create a function to add a new line to the log file.

For example, the following addLog() function automatically adds the current date and time to each log line and adds a newline at the end:


function addLog($handle, string $log)
{
  /* Datetime to add at the beginning of the log line. */
  $date = date('d/m/Y H:i:s');
  
  /* Complete log line. */
  $line = $date . ' ' . $log . "n";
  
  /* Add the new line to the log file. */
  fwrite($handle, $line);
}

Note that the fwrite() function needs the resource handle returned by fopen(). This is why you are passing this handle to addLog() as first argument.

Now, instead of printing your debug information to screen, you pass it to addLog() as second argument. The debug text will be added in a new line in the log file.

Let’s see a few examples.

This is how to add a single variable value (remember to open the log file with fopen() before adding the log):


$addr = 'www.google.com';
$domain = mb_substr($addr, mb_strpos($addr, '.') + 1);
/* Log the $domain variable */
addLog($handle, 'domain is: ' . $domain);

When the script is executed, a new line is added to the debug log file:


04/10/2020 17:55:16 domain is: google.com

Note that you don’t have to restrict the logging like you do with HTML output, because the logging process is completely invisible to regular users.

To log the output from get_defined_vars(), you can set the second print_r() argument to TRUE to save its output in a variable. Then, you pass that variable to addLog():


$addr = 'www.google.com';
$dotPos = mb_strpos($addr, '.');
$domainPos = $dotPos + 1;
$domain = mb_substr($addr, $domainPos);
/* Save the output from print_r/get_defined_vars into $vars. */
$vars = print_r(get_defined_vars(), TRUE);
/* Log the $vars variable */
addLog($handle, 'Variables: ' . $vars);

You can repeat the same exact procedure to log the output from debug_backtrace() as well.

Log file locking

When more PHP scripts write to the same file, you need to make sure writes are not performed at the same time.

The same must be done for multiple instances of the same PHP script (that is, if more users execute the same script).

What you need to do is to set a file lock every time you write to the log file.

To do that, edit your addLog() function so that it uses flock() to acquire an exclusive lock on the file:


function addLog($handle, string $log)
{
  /* Datetime to add at the beginning of the log line. */
  $date = date('d/m/Y H:i:s');
  
  /* Complete log line. */
  $line = $date . ' ' . $log . "n";
  
  /* Lock the log file before writing. */
  flock($handle, LOCK_EX);
  
  /* Add the new line to the log file. */
  fwrite($handle, $line);
  
  /* Release the lock. */
  flock($handle, LOCK_UN);
}

That’s it.

There are other and more efficient ways to perform file locking, but the above solution works just fine for our purpose.

Database logging

Database logging is about saving your debug logs to the database instead of a regular file. It’s an alternative to file logging.

Database logging has some advantages over file logging:

  • You can perform searches and filtering more easily.
  • You can export the logs on an XLS or CSV file as needed.
  • You don’t need to open/close files and you don’t need to use locking (the database already does that for you).

On the other hand, database logging is a bit more complex to set up, as you need to create the database structure.

Also, intensive logging (many logs per second) can affect your database performance.

That said, let’s see how it’s done.

Database structure

First, let’s create a table where to save the logs.

One of the advantages of database logging is that you can create a column for each piece of information. For example: the datetime, the script name, and the log text itself.

This makes searches and filtering operations a lot easier.

The following SQL code creates a table with a timestamp column, a script column for the name of the source script, and a log column for the log message:


CREATE TABLE `logs` (
  `id` int(10) UNSIGNED NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `script` varchar(254) NOT NULL,
  `log` varchar(254) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `logs`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `logs`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

Now you need a function to add a new log row to the table.

This function, let’s call it addDBLog(), does not write to a file. Instead, it executes an SQL query to insert a new row into the above table.

With file logging, addLog() takes the file handler as first argument. When using databases, you need to pass the database connection resource instead.

This resource is either a MySQLi object or a PDO object.

For example, let’s say you are using PDO. The following code (taken from my MySQL with PHP tutorial) connects to a local MySQL server using PDO and saves the PDO connection resource into the $pdo variable:


/* Host name of the MySQL server */
$host = 'localhost';
/* MySQL account username */
$user = 'myUser';
/* MySQL account password */
$passwd = 'myPasswd';
/* The schema you want to use */
$schema = 'mySchema';
/* The PDO object */
$pdo = NULL;
/* Connection string, or "data source name" */
$dsn = 'mysql:host=' . $host . ';dbname=' . $schema;
/* Connection inside a try/catch block */
try
{  
   /* PDO object creation */
   $pdo = new PDO($dsn, $user,  $passwd);
   
   /* Enable exceptions on errors */
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
   /* If there is an error an exception is thrown */
   echo 'Connection failed<br>';
   echo 'Error number: ' . $e->getCode() . '<br>';
   echo 'Error message: ' . $e->getMessage() . '<br>';
   die();
}

And here is the addDBLog() function:


function addDBLog(PDO $pdo, string $script, string $log)
{
  /* Insert query. */
  $query = 'INSERT INTO logs (timestamp, script, log) VALUES (NOW(), :script, :log)';
  
  /* Query values. */
  $values = [':script' => $script, ':log' => $log];
  
  /* Query execution. */
  try
  {
    $res = $pdo->prepare($query);
    $res->execute($values);
  }
  catch (PDOException $e)
  {
    echo 'Query error: ' . $e->getMessage();
    die();
  }
}

You can use addDBLog() just like you use addLog().

The only differences are:

  • You need to connect to the database first.
  • You need to pass the PDO connection resource instead of the file handle.
  • You need to pass the script name.
  • The log will end up on the database.

To pass the script name, you can use the magic constant __FILE__.

For example:


$addr = 'www.google.com';
$dotPos = mb_strpos($addr, '.');
$domainPos = $dotPos + 1;
$domain = mb_substr($addr, $domainPos);
/* Save the output from print_r/get_defined_vars into $vars. */
$vars = print_r(get_defined_vars(), TRUE);
/* Log the $vars variable */
addDBLog($pdo, __FILE__, 'Variables: ' . $vars);

You can edit addDBLog() to make it use MySQLi instead of PDO. You just need to use the MySQLi syntax and pass a MySQLi connection resource instead of a PDO one.

If you want, you can also combine file logging with database logging, using both addLog() and addDBLog() one after the other.

Sending debug data to an email address

Sometimes, you want to receive debug information only when a specific condition arises. For example, when an authentication attempt fails, or when a database query error occurs.

In such cases, you may want to get the debug data immediately. To do that, you can make your PHP scripts send the data to you via email.

It’s important to make sure not to send too many emails, otherwise you may overflow your inbox with debug messages!

To send emails with PHP, I suggest you use the PHPMailer library.

You can follow my PHPMailer tutorial to install it and get it running.

Once you are ready, you can create a function that sends a message to a specific email address. You will use this function to send debug data as email messages.

Here is a simple example:


function sendDebugData(string $data)
{
  /* Create a new PHPMailer object. */
  $mail = new PHPMailer();
  
  /* Set the mail sender and recipient. */
  $mail->setFrom('debug@yourdomain.com');
  $mail->addAddress('debug@yourdomain.com');
  
  /* Set the subject. */
  $mail->Subject = 'PHP debug data';
  
  /* Set the mail message body. */
  $mail->Body = 'Debug data: ' . $data;
  
  /* Send the mail. */
  $mail->send();
}

For all the details about how to use PHPMailer you can refer to my tutorial.

Now, all you need to do is to call the above function with the debug information you want to send.

For example, the following code snippet sends useful debugging information if a PDO query execution fails:


/* PDO connection. */
$pdo = new PDO( /* Connection parameters here. */ );
/* An SQL query. */
$query = 'SELECT * FROM your_table';
/* Start a try/catch block to catch PDO exceptions. */
try
{
  /* Prepare step. */
  $res = $pdo->prepare($query);
  
  /* Execute step. */
  $res->execute();
}
catch (PDOException $e)
{
  /* Query error. */
  
  /* Create a string with useful debug data. */
  $debugData = 'An SQL query failed. The query is: "' . $query . '". The error is: "' . $e->getMessage() . '"';
  
  /* Send an email with the debug data. */
  sendDebugData($debugData);
}

(For more details about PDO and MySQL, you can refer to my PHP with MySQL tutorial).

Отладка сообщения об ошибке

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

Действия, которые необходимо предпринять перед отладкой сообщения об ошибке

  1. Прочтите сообщение об ошибке . Поймите, о чем говорит сообщение об ошибке. Это должно дать вам некоторое представление о том, что пошло не так, а также предложение о том, как это решить.
  2. Проверка на распространенные ошибки . Ищите распространенные ошибки, такие как опечатки или пропущенные знаки препинания. Это может помочь вам быстро определить источник проблемы.
  3. Протестируйте код . Протестируйте код в локальной среде разработки, чтобы увидеть, сможете ли вы воспроизвести ошибку. Это может помочь вам сузить круг источников проблемы.
  4. Просмотрите документацию . Если вы не знакомы с языком или платформой, с которой работаете, рекомендуется просмотреть документацию и убедиться, что вы используете правильный синтаксис.
  5. Проверьте файлы журналов . Проверьте файлы журналов, чтобы узнать, есть ли в них дополнительная информация, которая может помочь вам понять ошибку.
  6. Просите о помощи . Если ничего не помогает, не бойтесь просить о помощи. Есть много людей, которые будут рады помочь вам с вашими проблемами кодирования.

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

Анализ доступа к серверу и журналов ошибок

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

Типы журналов

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

  • Журналы веб-сервера: информация о запросах веб-страниц, аналитика веб-трафика и статистика о веб-браузерах и операционных системах, используемых посетителями.
  • Журналы сервера базы данных: информация о запросах на доступ к базе данных, а также статистика об успешных и неуспешных запросах.
  • Журналы почтового сервера: сведения о сообщениях электронной почты, отправленных через почтовый сервер, а также об ошибках доставки почты.
  • Журналы мониторинга: информация, собранная с помощью инструментов системного мониторинга, например, использование ЦП и дискового пространства.

Использование журналов для устранения неполадок

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

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

Преимущества безопасности журналов

В дополнение к устранению неполадок журналы обеспечивают ряд преимуществ в плане безопасности. Журналы могут помочь пользователям отслеживать источник злонамеренных атак и выявлять недостатки в процессах аутентификации системы.

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

Задача инструкции
Узнайте, какая версия PHP используется Проверьте версию PHP с помощью команды php -v на вашем Linux-сервере.
Обновите версию PHP до нужной версии Следуйте инструкциям по предоставленной ссылке: https://www.tecmint.com/install-upgrade-php-versions-in-ubuntu/
Протестируйте версию PHP, чтобы убедиться, что она была успешно обновлена. Проверьте версию PHP с помощью команды php -v на сервере Linux, чтобы убедиться, что обновление прошло успешно.

Отладка ошибок PHP с помощью общих инструментов

Проверка синтаксиса и функциональности кода

Тестирование синтаксиса и функциональности кода — важная часть разработки эффективной программы. Это гарантирует, что код соответствует отраслевым стандартам и работает так, как было задумано. Этот тип тестирования может быть выполнен вручную или с помощью автоматизированных подходов.

Ручное тестирование кода

Ручное тестирование кода включает в себя процесс выполнения и тестирования кода по одной строке за раз. Этот метод позволяет более тщательно проверять код, а также позволяет настраивать его в соответствии с конкретными потребностями программы. Ручное тестирование кода может включать следующие этапы:

  • Просмотр и понимание кода.
  • Проверка синтаксиса кода, чтобы убедиться, что код соответствует отраслевым стандартам.
  • Компиляция кода для проверки и сообщения о любых синтаксических ошибках.
  • Запуск кода через интерпретатор для обнаружения любых логических ошибок.
  • Проверка всех возможных сценариев и ввод тестовых данных для подтверждения работоспособности кода.

Автоматическое тестирование кода

Автоматизированное тестирование кода — это подход к тестированию программного обеспечения, при котором для выполнения тестов используется компьютерная программа. В автоматизированном тестировании кода используются различные инструменты тестирования, такие как модульное тестирование, интеграционное тестирование, стресс-тестирование, нагрузочное тестирование, тестирование производительности и тестирование на приемлемость для пользователей. Эти тесты предназначены для обнаружения любых проблем, связанных с логикой кода, производительностью, совместимостью кода и безопасностью. К преимуществам автоматизированного тестирования кода относятся:

  • Повышение эффективности тестов.
  • Улучшена точность результатов.
  • Более низкая стоимость.
  • Сокращение человеческих ресурсов, необходимых для тестирования.
  • Высокая масштабируемость для увеличения охвата.

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

Проверка имен переменных, ссылок и области действия

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

Что такое переменная?

Переменная — это имя, данное набору значений или данных. Имя переменной используется для хранения и доступа к этим данным. Например, переменная с именем «Счетчик» может представлять значение, которое увеличивается при каждом завершении процесса.

Что такое ссылка?

Ссылка — это указатель на определенную часть памяти. Он используется для доступа к данным, хранящимся в памяти программы. Например, ссылка на переменную с именем «Счетчик» позволит программе получить доступ к значению, хранящемуся в этой переменной.

Что такое масштаб?

Область действия переменной или ссылки определяет диапазон кода, в котором доступна конкретная переменная или ссылка. Сюда входят как локальные, так и глобальные переменные. Локальные переменные доступны только внутри текущей функции и недоступны вне ее. С другой стороны, глобальные переменные доступны любому коду внутри программы.

Как проверить имена переменных и ссылки

  • Проверьте правильность написания имен переменных, так как это может привести к некорректным ссылкам.
  • Убедитесь, что одна и та же переменная не используется несколько раз.
  • Проверяйте наличие неправильного регистра (заглавных букв) переменных, так как это может привести к неверным ссылкам.
  • Убедитесь, что имена переменных описательные и осмысленные.
  • Убедитесь, что все необходимые переменные объявлены и инициализированы.

Как проверить объем

  • Убедитесь, что глобальные переменные доступны только тем частям кода, где они необходимы.
  • Убедитесь, что доступ к локальным переменным не осуществляется за пределами функции, в которой они объявлены.
  • Убедитесь, что все необходимые переменные имеют правильную область действия.
  • Убедитесь, что любые изменения глобальных переменных вносятся из соответствующей области.
Шаг инструкции
1 Загрузите и установите Xdebug. Вы можете найти инструкции и ссылки для скачивания здесь: https://xdebug.org/docs/install
2 Отредактируйте файл php.ini, включив в него xdebug. Инструкции можно найти здесь: https://xdebug.org/docs/install
3 Начните отладку, установив точку останова в коде. Дополнительную информацию о том, как использовать точки останова, можно найти здесь: https://xdebug.org/docs/all_settings#breakpoints.
4 Запустите код и посмотрите информацию, представленную в консоли.
5 Исправьте все ошибки/ошибки, о которых сообщается.

Методы устранения неполадок для точного определения ошибок и переменных

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

  1. Проверьте журналы приложений

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

  2. Выявление и изоляция проблемных компонентов

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

  3. Тестирование программного обеспечения с несколькими пользователями

    Тестирование программного обеспечения с несколькими пользователями может быть полезным для выявления ошибок или переменных. Различные учетные записи пользователей могут использоваться для тестирования системы и предоставления данных о типах пользователей, сталкивающихся с проблемой, по сравнению с пользователями, которые не сталкиваются с ней. Ограничение тестов учетными записями с аналогичными уровнями доступа может быть полезным, поскольку дает меньше вариаций результатов.

  4. Соберите образцы данных

    Сбор образцов данных из работающей системы может помочь техническим специалистам сравнить базовую производительность с производительностью системы с проблемами. Путем сравнения выборочных данных с последними данными этот подход может помочь определить, откуда возникают проблемы и какие детали необходимо отремонтировать или заменить.

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

Отладка ошибок PHP с помощью общих инструментов

Пошаговый подход к отладке

Отладка — неотъемлемая часть процесса кодирования, и пошаговый подход может помочь вам быстро определить основную причину проблемы с кодом. Используя стратегию систематической отладки, вы можете свести к минимуму время, необходимое для отслеживания проблемы и исправления кода. Ниже приведены шаги, которые вы должны предпринять при решении проблемы отладки:

1. Поймите код

  • Ознакомьтесь с кодом, убедившись, что понимаете его логику.
  • Убедитесь, что соглашения о кодировании, используемые в коде, верны, и что код прост для понимания и выполнения.

2. Определите проблему

  • Конкретно опишите проблему и запомните ее.
  • Определите симптомы и возможные причины проблемы.

3. Воспроизведите проблему

  • Создайте тестовый пример, который точно отражает проблему.
  • Протестируйте код, чтобы определить, существует ли проблема.

4. Изолируйте проблему

  • Разбейте код на более мелкие разделы и протестируйте каждый раздел, чтобы увидеть, сохраняется ли проблема.
  • Сосредоточьтесь на конкретной области кода, в которой есть проблема, и найдите незаметные ошибки в затронутой области.

5. Исправьте проблему

  • Как только вы узнаете точную область, в которой находится проблема, вы можете внести необходимые изменения в код.
  • Протестируйте код еще раз, чтобы убедиться, что проблема устранена и код работает правильно.
Инструмент Функция
Скрипт SQL SQL Fiddle помогает быстро тестировать SQL-запросы и делиться ими с другими. Его также можно использовать для визуального различения разных запросов и создания сценариев данных T-SQL.
SQLBolt SQLBolt может помочь протестировать определенные запросы, просмотреть образец базы данных, создать таблицы и создать отчеты.
Кодшеринг CodeShare – это онлайн-инструмент, с помощью которого разработчики могут сотрудничать, делиться и тестировать свои коды. Он поддерживает базы данных SQL и NoSQL.
Скрипт SQL SQL Fiddle позволяет пользователям создавать и выполнять SQL-запросы к различным базам данных и предоставляет полезные визуализации для лучшего анализа результатов.

«Единственный способ сделать большую работу — любить то, что ты делаешь». — Стив Джобс

Обзор использования Query Monitor или Chrome DevTools для отзывов о производительности

Query Monitor и Chrome DevTools — это мощные инструменты для разработчиков, позволяющие подробно изучить их код и производительность их веб-сайтов или приложений. Эти инструменты используются для отслеживания ошибок и диагностики проблем с производительностью, а также для получения информации о HTML, Javascript и CSS страницы. Кроме того, Query Monitor и Chrome DevTools можно использовать для лучшего понимания пользовательского опыта веб-сайта или приложения.

Использование Query Monitor и Chrome DevTools

И Query Monitor, и Chrome DevTools можно использовать для отслеживания ошибок и проблем с производительностью, при этом Query Monitor специализируется на отладке кода, а Chrome DevTools фокусируется на диагностике проблем с макетом и дизайном веб-сайтов или приложений. Кроме того, их можно использовать, чтобы узнать, как загружается страница и сколько времени требуется для загрузки. Это может помочь разработчикам получить обратную связь, чтобы сделать их приложения или веб-сайты более эффективными.

При использовании Query Monitor или Chrome DevTools разработчики могут:

  • Посмотрите, сколько времени требуется для загрузки и выполнения каждого элемента кода.
  • Проверьте наличие конфликтующих стилей и скриптов
  • Ошибки в JavaScript или HTML страницы
  • Проверить время до первого байта в ответе на запрос
  • Изучите запросы AJAX и изучите отправляемые и получаемые данные.
  • Проверьте порядок загруженных ресурсов и стилей
  • Проверьте, загружаются ли активы локально или полагаются на внешние ресурсы
  • Проверьте элементы страницы, включая HTML, CSS и Javascript.

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

Основные проблемы при отладке ошибок PHP с помощью общих инструментов

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

Неполный синтаксис

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

Ошибки выполнения скрипта

Ошибки выполнения скрипта возникают, когда код синтаксически правильный, но не выполняется должным образом. Эти ошибки трудно диагностировать, и обычно они вызваны конфликтующими зависимостями или неправильными значениями переменных. Автоматизированные инструменты отладки могут помочь определить и изолировать источник проблемы, и если причину невозможно определить вручную, может потребоваться пошаговое тестирование приложения, чтобы определить точный источник проблемы.

Совместимость с браузером

Веб-приложения должны быть закодированы так, чтобы быть совместимыми с широким спектром веб-браузеров, поскольку каждый из них может интерпретировать код по-разному. Если скрипт работает в одном браузере, но не работает в другом, это может быть признаком наличия проблем с совместимостью. Использование таких инструментов, как автоматические средства проверки кода и средства тестирования браузера, может помочь в выявлении и устранении проблем такого типа.

Хостинговая платформа

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

Заключение

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

:

В: Какой самый распространенный инструмент отладки ошибок PHP?

О: Наиболее часто используемым средством отладки PHP является Xdebug.

В: Как лучше всего находить и устранять ошибки в коде PHP?

О: Лучший способ найти и устранить ошибки в PHP-коде — использовать автоматизированный инструмент, такой как Xdebug, который может помочь быстро выявить и отследить ошибки.

В: Как я могу отслеживать ошибки и переменные в коде PHP?

О: Лучший способ отслеживать ошибки и переменные в PHP — использовать встроенную функцию ведения журнала Xdebug, которая позволяет записывать ошибки и переменные в файл для последующего просмотра.

  1. Тарек А., 2019. Простые шаги по отладке ошибок PHP в WordPress [онлайн] Доступно по адресу: https://www.cloudways.com/blog/debugging-php-errors-wordpress/

  2. Yerraballi, M., 2016. Отладка ошибок PHP [онлайн] Доступно по адресу: https://www.maketecheasier.com/debug-php-errors/

  3. Батлер, Б., 2018. Как исправить ошибки PHP [онлайн] Доступно по адресу: https://www.a2hosting.com/kb/developer-corner/php/testing-and-debugging-php-errors .

  4. Sunnabutt, M., 2019. Как отлаживать ошибки PHP [онлайн] Доступно по адресу: https://phppot.com/how-to-debug-php-errors/

  5. Рэй, Б., 2018. Как отлаживать PHP: 8 простых шагов [онлайн] Доступно по адресу: https://www.sitepoint.com/debug-php-8-simple-steps/

Понравилась статья? Поделить с друзьями:
  • Photon launcher phasmophobia произошла одна или несколько ошибок
  • Philips saeco syntia коды ошибок
  • Peugeot 308 ошибка abs
  • Performance warning rust ошибка
  • Perco s20 ошибка отсутствует конфигурация считывателя иу