【问题标题】:PHP Get Page Load Stats - How to measure php script execution / load timePHP Get Page Load Stats - 如何测量 php 脚本执行/加载时间
【发布时间】:2011-05-23 16:35:40
【问题描述】:

我在标题中的内容:

$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;

我在页脚中的内容:

$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page generated in ' . $total_time . ' seconds.';

输出:在 1292008977.54 秒内生成的页面。

有人可以帮我弄清楚为什么结果不正确吗?我正在使用 PHP5。

【问题讨论】:

  • 你在某处覆盖 $start
  • 我刚刚在“页眉”和“页脚”之间使用sleep(2); 运行您的代码并得到Page generated in 2.0055 seconds. 所以它可能在您的脚本中间。 (这是上校 Shrapnel 在我运行测试时写的……)
  • 我的代码和前 2 个答案中列出的代码都适用于我。一定是我脚本的其余部分引起了问题。我确实注意到我的页脚文件中不存在开始时间变量。
  • 你是否在函数中包含了页脚文件?

标签: php time load pageload


【解决方案1】:

看到这是 Google 的第一个结果,我想我会分享我对这个问题的解决方案。将其放在页面顶部:

$startScriptTime=microtime(TRUE);

然后将这段代码放在页面底部:

$endScriptTime=microtime(TRUE);
$totalScriptTime=$endScriptTime-$startScriptTime;
echo "\n\r".'<!-- Load time: '.number_format($totalScriptTime, 4).' seconds -->';

当您查看页面的源代码时,您可以在 HTML 最后一行的评论中看到加载时间。

【讨论】:

    【解决方案2】:

    microtime()微秒 返回当前 Unix 时间戳。我没有看到任何从 微秒 到秒的转换的数学。

    microtime(true)

    为单位返回浮点数

    【讨论】:

    • 哎呀。我完全忘记了。阅读是基础:)
    【解决方案3】:

    您可以使用这个简单的函数来避免变量范围问题:

    <?php
    
    function timer()
    {
        static $start;
    
        if (is_null($start))
        {
            $start = microtime(true);
        }
        else
        {
            $diff = round((microtime(true) - $start), 4);
            $start = null;
            return $diff;
        }
    }
    
    timer();
    
    echo 'Page generated in ' . timer() . ' seconds.';
    

    【讨论】:

    • 天哪,这些热心的帮手们最后会学习 microtime(true) 吗?
    • @Col。弹片:我错了,刚把ATLChris的解决方案改写成第一种方法的函数……谢谢建议!
    • 整个函数已过时。只是$start=microtime(1); echo microtime(1) - $start;这里的函数没用。
    • @Col。弹片:我只是不明白你的功能问题。它使用本地静态变量来保存开始时间,因此您可以从脚本中的任何位置调用它。
    • 这不是我的问题,而是操作的问题。我很聪明,可以在没有蹩脚函数的情况下计算时间
    【解决方案4】:
    $page_loadtime_in_millisec = ($page_loadtime / 1000);
    echo '<pre>Page Infor:
    Page Load Time : ' . $page_loadtime.' <b>Microseconds</b><br/>
    Page Load Time : ' . $page_loadtime_in_millisec.' <b>Milliseconds</b><br/>
    Page Load Time : ' . number_format(($page_loadtime_in_millisec/1000),18) . ' <b>Seconds</b></pre>';
    

    【讨论】:

      【解决方案5】:

      我喜欢用这样的东西。可以轻松地对多个代码块进行计时,而无需处理变量名称等。会话必须启用。

      function code_timer ($name) {
      
          $mtime = explode(' ',microtime());
          $time = $mtime[1] + $mtime[0];
      
          //determine if we're starting the timer or ending it
          if ($_SESSION["timer-$name"]) {
            $stime=$_SESSION["timer-$name"];
            unset($_SESSION["timer-$name"]);
            return ($time - $stime);
          } else {
            $_SESSION["timer-$name"]=$time;
            return(true);  
          }
      }
      

      用法:

      code_timer ('a');
      //do stuff
      echo "page generated in " . code_timer('a');
      

      【讨论】:

      • 这不会解决他的问题,这里没有发生时间转换。看我的回答。
      • @Daniel Bingham:你的答案是错误的,上面的代码工作正常,你不必像你建议的那样对 microtime() 输出做任何事情。他的问题是 start 变量在他的脚本中间被覆盖了。如果您只是复制并粘贴,这些家伙的代码就可以正常工作。问题是他在未发布的代码之间有什么。
      • @shrapnel,好的巨魔。尝试发布一次有用的东西,在这个例子中可能用处不大,但如果你努力,你可能会想到它的用途。
      • @shrapnel,OP 逻辑工作得很好,但是实现被破坏了,因为这家伙在他的代码中的某个地方取消了他的起始值。将它放在一个函数中,该函数专门创建一个可能没有在其他地方使用过的变量(“timer-$name”),解决了这个问题。有一些东西要发布,因为他的代码对他不起作用。这是一个简单的替代方案。我意识到他发布的代码是独立的,我在上面提到过。阅读内容并实际思考,然后再高高在上。
      【解决方案6】:

      把它放在你的标题中

      <?php
      
      $starttime = explode(' ', microtime());
      $starttime = $starttime[1] + $starttime[0];
      
      ?>
      

      这个在你的页脚

      <html><center>Page generated in <?php $load = microtime();print (number_format($load,2));?> seconds. <?php
      $loadtime = explode(' ', microtime()); $loadtime = $loadtime[0]+$loadtime[1]-$starttime; echo 'Peak memory usage: ',round(memory_get_peak_usage()/1048576, 2), 'MB';
      ?></center></html>
      

      这将告诉您生成网站页面需要多长时间以及加载页面使用了多少内存

      【讨论】:

        【解决方案7】:

        问题在于变量范围。您在页眉中设置了 $start 变量,但在页脚中,此变量将为空。所以 $total_time 只是当前时间 - 0,给你当前时间。

        一个解决方案是使用 php 的 GLOBALS。在标题中:

        $GLOBALS['time_start'] = microtime(true);
        

        在页脚中:

        $total_time = round(($finish - $GLOBALS['time_start']), 4);
        

        【讨论】:

          【解决方案8】:

          我不会在每个页面中使用 microtime,而是将 microtime 插入 $_REQUEST,然后从函数内的当前时间中减去该时间,并设置在脚本执行终止时调用该函数:

          register_shutdown_function ( 'Your_function_name' );

          我认为使用将包含在整个应用程序中每个脚本/类的开头的全局脚本很有用,它可以帮助我处理错误、管理会话等...

          将 microtime 添加到 $_REQUEST 将是该脚本的第一行,您也可以在其中包含终止函数。

          【讨论】:

            【解决方案9】:

            footer 的一个衬里,它以 float 返回 seconds

            echo number_format(microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"],4);
            

            【讨论】:

              猜你喜欢
              • 2011-09-08
              • 2019-05-28
              • 1970-01-01
              • 2011-07-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多