我需要测量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?
答案 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
我希望这能解决你的问题。