首页 > 解决方案 > 在开发中,输出故障排除代码仅适用于标准页面加载,ajax 存在问题

问题描述

摘要:我有一个解决方案,用于在我的环境中监视变量和代码处理。它适用于静态页面,下面的代码是一个可用的解决方案。但是,如果页面包含在页面运行后更新公共变量的 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();
  });
});

这在页面本身上:

        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 '</pre></div></div>';

(以及页面末尾的类似输出)

因此,对于大多数页面,这种快速检查页面变量的方法效果很好。并生成一个漂亮的 javascript 按钮,我可以在其中快速检查页面上的开始和结束变量,以及 _TROUBLESHOOTING 数组,我可以轻松转储任何我想要快速查看页面开始和结束的值。

漂亮的按钮和显示页面数据的显示

所以这个系统对我来说已经运行了很长一段时间了。然而,问题来自 ajax 调用。我尝试了几种不同的方法,但 ajax 调用通常需要并期望某种格式的数据。我想要制作第三个 div 来显示数据以及一个按钮,但是我很难弄清楚如何将任何输出数据与 ajax 调用一起搭载,并且必须调用它当调用 ajax 以了解所有变量如何变化并跟踪我正在排除的任何问题时。当然,我每次都可以将输出输出到错误日志中,但这在工作流程上速度较慢,并且需要从上次清除日志以来的所有输出中查找,而不是在我操作时简单地查看我的数据是什么。

有没有人有一个好主意可以利用 ajax 调用来利用这些现有类型的调用?因为弄乱 ajax 调用的返回值总是会导致 ajax 调用本身的错误数据。

标签: javascriptphpajax

解决方案


在我考虑了一段时间后,解决方案相当简单:

对于ajax请求,将数据发送到会话中的子数组;一个子数组,通常被正常的两个打印输出忽略。然后,有第三个按钮,它是一个 ajax 请求,专门获取该子数组的值。子数组可以专门为每一个已经完成的ajax调用填充一个子数组,然后当被第三个按钮获取时,它创建一个div来共享它然后清空子数组(否则它会膨胀太快),允许查看自上次单击按钮以来的所有 ajax 调用(并将它们附加到现有列表中,如果仍在同一页面上。)


推荐阅读