测量json_encode的时间并将json对象和计时器返回给AJAX

时间:2017-04-05 08:48:17

标签: php json ajax

我需要测量json_encode操作的时间,然后将该值与json对象一起返回,而不对其进行解码。我怎样才能做到这一点?

我目前的代码是:

$start2 = microtime(true);
$all = json_encode(array(iterator_to_array($cursor),$timeExecuted));
$end2 = microtime(true);
$result = ($end2-$start2);
echo $all;

如何在不解码json对象的情况下返回$ all和$ result?

2 个答案:

答案 0 :(得分:0)

您的问题是您尝试向客户端发送JSON响应,但在该JSON响应中包含生成响应所花费的时间。这是不可能的,但是你可以通过包括生成响应所花费的时间来近似它,但不包括生成响应所花费的时间(更现实)。

我认为最简单的解决方案是:

$start2 = microtime(true);
$all = json_encode(array(iterator_to_array($cursor),$timeExecuted));
$end2 = microtime(true);
$result = ($end2-$start2);
echo json_encode(["all" => $all, "result" => $result ]);

然而,在客户端,您现在需要这样做:

success: function (data) {
     var all = JSON.parse(data.all);
     var time = data.result; 
}

您还可以进行某种类型的修复,可能会或可能不会像以下一样:

...
echo "[" . json_encode($result). ", ". $all . "]";

然后您可以访问结果,如:

success: function (data) {
       var time = data[0];
       var all = data[1];
}

当你使用第二种方式时要小心。由于可能出现奇怪的编码问题,这通常是不好的做法。这里应该没问题,因为$result是一个数字,但一般来说,它不是最好的解决方案。

注意:不要忘记在回显任何内容之前设置内容标题,这将告诉AJAX它收到了JSON响应并将相应地解析它:

 header("Content-Type: text/json");

可能有效或无效的第三种解决方案(未经测试):

$start2 = microtime(true);
$all = json_encode(array(iterator_to_array($cursor),$timeExecuted));
$end2 = microtime(true);
$result = ($end2-$start2);
header("Content-Type: text/json");
header("X-Encoding-Time: ".$result);
echo $all;

在你的AJAX中:

success: function (data, textStatus, request) {
      var all = data;
      var result = request.getResponseHeader("X-Encoding-Time");
}

答案 1 :(得分:0)

首先使用字符串连接,然后在需要时爆炸字符串。

    $start2 = microtime(true);
    $all = json_encode(array(iterator_to_array($cursor),$timeExecuted));
    $end2 = microtime(true);
    $result = ($end2-$start2);
    $output=$all."|".$result;
    echo $output;

然后你可以在需要时使用" |"分隔字符串。作为分隔符。

$output_array=explode("|",$output);
$all=$output_array[0]; // JSON string
$result=$output_array[1];  // Time

我希望这能解决你的问题。