В процессе разработки вывод кода устранения неполадок работает только при стандартных загрузках страниц, ajax создает проблемы - PullRequest
0 голосов
/ 18 июня 2019

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

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

<?php

register_tick_function(function(){
  if (isset($GLOBALS["developer_debug"]) && $GLOBALS["developer_debug"] == 'active'){
    $backtrace = debug_backtrace();
    $line = $backtrace[0]['line'] - 1;
    $file = $backtrace[0]['file'];

    if ($file == __FILE__) return;

    static $fp, $cur, $buf;
    if (!isset($fp[$file])) {
        $fp[$file] = fopen($file, 'r');
        $cur[$file] = 0;
    }

    if (isset($buf[$file][$line])) {
        $code = $buf[$file][$line];
    } else {
        do {
            $code = fgets($fp[$file]);
            $buf[$file][$cur[$file]] = $code;
        } while (++$cur[$file] <= $line);
    }

    $line++;
    if (defined('ERR_LOG')){ $error_log = ERR_LOG; } else {
      $error_log = "../logs/error_log";
    }
    error_log("\n==========================================================\n", 3, $error_log);
    error_log("\n $file : $line :: $code \n", 3, $error_log);
    error_log("\n Variables: \n" . print_r(get_defined_vars(), true) . "\n", 3, $error_log);
    $GLOBALS["_TROUBLESHOOTING"][] = "<code>\n $file : $line ::: ". htmlentities($code, ENT_QUOTES) . " \n</code>";
  }
}, ["_SERVER" => $_SERVER, "_COOKIE"=>$_COOKIE, "_REQUEST"=>$_REQUEST, "_SESSION"=>$_SESSION, "_GLOBALS"=>$GLOBALS]);
// To use...
// declare(ticks=1);
// include_once('debug.php');

и в мои прямые загрузки страниц (например, index.php) я могу включить это js:

$(document).ready(function() {
  var dev_top_button = document.createElement("Button");
  dev_top_button.innerHTML = "Top Dev Data";
  dev_top_button.style = "top:0;right:75%;position:absolute;z-index: 9999"
  document.body.appendChild(dev_top_button);

  var dev_bottom_button = document.createElement("Button");
  dev_bottom_button.innerHTML = "Bottom Dev Data";
  dev_bottom_button.style = "top:0;right:50%;position:absolute;z-index: 9999"
  document.body.appendChild(dev_bottom_button);

  $(dev_top_button).click(function(){
    $("#debug_top").toggle();
  });

  $(dev_bottom_button).click(function(){
    $("#debug_bottom").toggle();
  });
});

и это на самой странице:

<code>        echo "<div class='debug_outer' id='debug_top'><h3>Developer Information</h3><div class='debug_inner'><pre>";

        if (isset($GLOBALS['_TROUBLESHOOTING']) && is_array($GLOBALS['_TROUBLESHOOTING']) && ! empty($GLOBALS['_TROUBLESHOOTING'])) {

            $troubleshooting_return_array = $GLOBALS['_TROUBLESHOOTING'];

        } else {

            $troubleshooting_return_array = ['Empty'];
        }

        echo print_r(["_COOKIE" => $_COOKIE, "_REQUEST" => $_REQUEST, "_SESSION" => $_SESSION, "_TROUBLESHOOTING" => $troubleshooting_return_array, "_SERVER" => $_SERVER, "_GLOBALS" => $GLOBALS], true);
        echo '
';

(и аналогичный вывод в конце страницы)

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

Nice buttons and display to show page data

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

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

1 Ответ

0 голосов
/ 20 июня 2019

Решение было довольно простым после того, как я немного подумал:

Для запросов AJAX отправьте данные во вложенный массив в сеансе; под-массив, который обычно игнорируется обычными двумя распечатками. Затем, есть третья кнопка - запрос ajax, который специально выбирает значение этого подмассива. Под-массив может быть специально заполнен массивом sub-sub для каждого выполненного ajax-вызова, а затем при получении третьей кнопкой создает div для его совместного использования, а затем очищает под-массив (в противном случае он будет слишком быстро), разрешить просмотр всех вызовов ajax с момента последнего нажатия кнопки (и добавление их в существующий список, если он все еще находится на той же странице.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...