Представьте себе следующий сценарий: ваши клиенты посещают веб-сайт (давайте представим этот ) и видим все, кроме ожидаемого результата. Обычная реакция — позвонить вам (в самое неподходящее время) и попросить исправить это как можно скорее, потому что они теряют деньги.
Как мы можем помочь пользователю сообщить об ошибке максимально точно?
Ошибка
Давайте получим действительно простой запрос JSON и ошибку, чтобы иметь возможность воспроизвести наш случай:
$json_data = '{"value":1,"apples":2,"name":3,"oranges":4,"last one":5}';
//we will simulate the json data, but imagine that this is the normal data exchanged daily between your client’s website and a 3rd party API
$ch = curl_init('http://talkweb.eu/labs/fr/json_callback.php');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json',
'Content-Length: ' . strlen($json_data)));
//the normal CURL request, nothing strange here:
$result = curl_exec($ch);
//receiving the data back
$f_data = json_decode($result,true);
//showing a greeting with the output
echo “Welcome”. $f_data['username'];
Если вы посетите тестовый веб-сайт сейчас, вы заметите, что есть проблема.
Вопрос в том, как клиент может сообщить об этом быстрее со всеми данными, необходимыми для борьбы с ошибкой:
- Данные Json,
- Ошибки Javascript и XmlHttpsRequest на стороне сервера,
- Некоторые основные ошибки PHP
- … и метаданные.
Интересным решением для сбора этой информации является UserSnap. Виджет, который позволяет пользователям отмечать скриншот сайта, на котором они находятся, и отправлять вам все, что есть в консоли JavaScript. Ошибки PHP там не заканчиваются, правда? Давайте сделаем их. Сначала мы соберем ошибки на стороне сервера.
Сбор ошибок
Давайте добавим немного кода в пример, чтобы увидеть, как мы можем собирать нужные нам данные. Представляем действительно простой класс, чтобы помочь нам:
<?
class SendToUsersnap
{
var $m;
//Save all logs in an array. You can use an even more elegant approach but right now I need it to be simple for the sake of this tutorial.
function log ( $data, $type ) {
if( is_array( $data ) || is_object( $data ) ) {
$this->m[]= "console.".$type."('PHP: ".json_encode($data)."');";
} else {
$this->m[] = "console.".$type."('PHP: ".$data."');";
}
}
// Print all logs that have been set from the previous function. Let’s keep it simple.
function out (){
for ($i=0;$i<count($this->m);$i++)
{
echo $this->m[$i]."\n";
}
}
}
Теперь давайте используем этот класс для записи всех ошибок и журналов, которые нам могут понадобиться.
require_once('Usersnap.class.php');
$s = new SendToUsersnap;
$json_data = '{"value":1,"apples":2,"name":3,"oranges":4,"last one":5}';
$s->log('Initializing the JSON request',"info");
$s->log($json_data,"log");
$ch = curl_init('http://talkweb.eu/labs/fr/json_callback.php');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($json_data)));
$result = curl_exec($ch);
$f_data = json_decode($result,true);
echo 'Welcome'. $f_data['usersname'];
$s->log($f_data,"log");
$s->log(error_get_last(),"error");
Передайте это UserSnap
Давайте добавим фрагмент кода UserSnap в конце нашей страницы и посмотрим, что произойдет. (Для использования этого виджета может потребоваться учетная запись. Usersnap предлагает бесплатные лицензии для проектов с открытым исходным кодом и бесплатный период тестирования для коммерческих.
<script type="text/javascript">
(function() {
var s = document.createElement("script");
s.type = "text/javascript";
s.async = true;
s.src = '//api.usersnap.com/load/'+
'your-api-key-here.js';
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
})();
var _usersnapconfig = {
loadHandler: function() {
<?php
//just print all errors collected from the buffer.
$s->out(); ?>
}
};
</script>
Примечание. Это можно сделать в шаблоне представления в реальной среде, но поскольку здесь мы не используем настоящее приложение MVC, мы пропускаем эту часть.
Пользователь увидит кнопку «сообщить об ошибке» на странице и напишет вам сообщение «это не работает, исправьте это как можно скорее». Как правило, это будет бесполезная информация, но на этот раз мы также прикрепляем этот великолепный журнал ошибок:
Теперь вы можете видеть, что инициализация на месте:
$s->log('Initializing the JSON request',"info");
Вы можете увидеть данные, которые мы отправим — как обычно
$s->log($json_data,"log");
И вы можете увидеть результат. Да, проблема есть. Очевидно, есть проблема с аутентификацией.
$s->log($f_data,"log");
Вы можете получить даже основные ошибки PHP, чтобы помочь вам с отладкой.
$s->log(error_get_last(),"error");
Вашему клиенту нужно будет всего лишь нажать кнопку один раз, и вы получите все необходимое, чтобы быстрее справиться с ошибкой:
- Ошибки и журналы (как показано выше)
- Аннотированный скриншот — если проблема сложнее, чем этот простой пример
- Размер экрана, версия браузера, ОС и плагины, установленные в браузере
Конечно, вы можете включить эту функцию только тогда, когда она нужна вашему клиенту. Чтобы ограничить доступность виджета, добавьте IP-фильтр или барьер параметров запроса, откройте поддомен dev. * И т. Д.
Вывод
Это не инструмент мониторинга сценариев, и он не будет автоматически доставлять информацию, когда и если возникнет проблема. Этот подход будет работать только в том случае, если пользователь или клиент сообщит об ошибке, а вам, как разработчику или QA, потребуется дополнительная информация о том, как с ней бороться. Представьте, что это удаленный отладчик, но для ошибок на стороне клиента + события и данные, которые вы отправляете из PHP в JavaScript.
Я хотел бы ответить на все ваши вопросы! Оставьте свой отзыв ниже!