我刚在Webdev商店实习,我的第一项工作是解决我们的一个客户遇到的问题。长话短说,前雇员编写的某些代码中存在一些问题,并且由于某些未知原因,加载时间在客户的网站上变慢。我的老板告诉我在代码中插入一个记录器,这样我就可以记录给定方法花费的时间,并找出哪个方法在“浪费”时间。我必须将给定方法花费的时间日志打印到SERVER上的日志文件中。例如,我想做这样的事情:
function search(x,acc)
{
var startTime = new Date().getTime();
//
//
//method code
//
//
var timeTaken = new Date().getTime() - startTime;
//the question is now how do I print that to some kind of
//server side log file i.e. "/etc/etc/logFile.log"
}
我对此感到有些困惑,因为显然Javascript是在客户端解释的,并且我希望此文件存在于服务器端,而且我不确定从何处开始。供参考,页面是.js文件嵌入HTML的.php文件。
编辑:我已经在一些答案的帮助下尝试了一些操作。让我们看看这个解决方案的好坏。
//js function:
function search(x,acc)
{
var startTime = new Date().getTime();
//do some stuff
var middleOfFunction = new Date().getTime() - startTime;
// do some more stuff
var endOfFunction = new Date().getTime() - middleOfFunction;
//find out which chunk of code took longer, the beginning or the end
var max = Math.max(endOfFunction , middleOfFunction);
<?php
$message = 'The longest part of the function took :' . $max . ' seconds.'
file_put_contents($file, $message , FILE_APPEND | LOCK_EX);
?>
实际的代码比这要复杂一些,我有一个更具描述性的消息,显示了代码的哪一部分花费了更长的时间,但这是基本思想。这有意义吗,还是在任何JS都运行到客户端之前将php运行在服务器端?我对这种东西感到困惑。感谢大家的帮助,这对我来说意义非凡。我要努力工作直到第二天都在家工作,所以我没有老板来问他问题。
再次感谢,休息。
也许最好的主意是使用AJAX / $。post();
每次发生某事,您都会这样做:
$.post("url/to/php_file.php",{variable: "its_content"},function(response){
if(response=="what_you_wanted_to_happen")
alert(response_or_some_other_variable);//or do nothing, but for debugg do some alerts
else
//do something else here
});
在服务器端,您可以在这里找到信息:How to create log file of my web site in php?
尝试microtime(true);
$start = microtime(true);
// do stuff
$totaltime = microtime(true) = $start;
并登录:
file_put_contents($file, $totaltime, FILE_APPEND | LOCK_EX);
您可以将其存储在"<input type='hidden' name='jsTime' id='jsTime' />
中。您的JavaScript可能看起来像:
function E(e){
return document.getElementById(e);
}
function timeTaken(hiddenId, submitId, func, funcArgsArray){
E(submitId).onclick = function(){
var start = new Date().getTime();
func.apply(func, funcArgsArray);
E(hiddenId).value = new Date().getTime() - start;
}
}
如果您有<input type='submit' name='sub' id='sub' value='SUBMIT' />
和上面的隐藏输入,以及一个带有两个参数的名为testFunction
的函数,则可以像下面这样使用该函数:
timeTaken('jsTime', 'sub', testFunction, ['arg1', variable2]);
由于onclick
在提交前触发,因此隐藏值将被更新,因此服务器可以使用$_GET['jsTime']
或$_POST['jsTime']
来访问它。
注意:这只会测试JavaScript函数时间。