2016-06-09 74 views
1

我想在我的站點的每個頁面(即ZF2)中打印請求執行時間。顯示ZF2請求執行時間

我已經在index.php(這是請求訪問的第一個文件)中定義了一個常量,其中包含請求初始值microtime(true)
現在,我應該在哪裏獲得最終請求microtime(true)

我的計劃是有這樣的事情:

$executionTime = ($finalTime - $initialTime)/1000000; // in seconds 
$executionTime = number_format($executionTime, 2); 
+0

在你的問題上的確切答案http://stackoverflow.com/a/32646823/949273 – tasmaniski

+0

@tasmaniski這並沒有闡明什麼是我應該使用microtime的'末端'地方。 –

+0

結尾是index.php文件的結尾。因此,在文件末尾添加該行。 – tasmaniski

回答

0

我的解決方案是根據this answer

我的每個視圖都附有一個footer.phtml,所以如果我在那裏打印它,就不需要更改很多文件。

要打印那裏的時候,我首先寫了一些具體的事情到footer.phtml,例如Execution time:

module/Application/Module.php我加入這個代碼onBootstrap()

$eventManager->attach(\Zend\Mvc\MvcEvent::EVENT_FINISH, function($e) { 
    $time = microtime(true) - REQUEST_MICROTIME; 

    // formatting time to be more friendly 
    if ($time <= 60) { 
     $timeF = number_format($time, 2, ',', '.').'s'; // conversion to seconds 

    } else { 
     $resto = fmod($time, 60); 
     $minuto = number_format($time/60, 0); 
     $timeF = sprintf('%dm%02ds', $minuto, $resto); // conversion to minutes and seconds 
    } 

    // Search static content and replace for execution time 
    $response = $e->getResponse(); 
    $response->setContent(str_replace(
     'Execution time:', 'Execution time: '.$timeF, $response->getContent())); 

}, 100000); 
2

爲了達到你的要求,多一些,在開發環境中,你可以使用Zend Developer Tools模塊,這些模塊會自動給你關於一些信息你的申請。

在生產環境中,你可以改爲聽MvcEvent::EVENT_FINISH,這是Zend框架所發出的最後一個事件MVC

+0

我想在生產環境中做到這一點,以顯示在每一頁,作爲一種向用戶證明系統不慢的證據。 –

+1

好的,所以我的解決方案絕對不是你要找的。然後我建議你附加到MvcEvent :: EVENT_FINISH(http://framework.zend.com/manual/current/en/modules/zend.mvc.mvc-event.html#order-of-events) – marcosh

+0

真棒!如果你編輯你的答案,我會接受它,我也會贊成一個例子(: –

3

的問題是,你可能要將此信息添加到視圖(因此用戶可以看到它),這意味着在渲染視圖之前添加時間(在MvcEvent::EVENT_RENDER之前)。問題是雖然視圖在MvcEvent::EVENT_FINISH被觸發之前呈現,但時間不準確。這將不容易解決...


你可以考慮在響應中添加一些時間相關的頭。 Here an interesting related question about adding your custom headers

  • 有例如a $request_time variable for NGinx,你可以使用外的開箱

    $ REQUEST_TIME
    請求處理與毫秒的分辨率秒的時間(1.3。 9,1.2.6);由於第一字節經過時間是從所述客戶端

    add_header X-Request-Time $request_time always; 
    
  • 讀還有一個Age響應報頭字段。你可以找到它here in the Header Field Definitions section 14.6 in RFC2616

    年齡響應頭域傳送 量的時間的發送者的估計,因爲所述響應(或其再驗證)是在原始服務器生成 。如果其年齡未超過其新鮮度壽命,則緩存的響應是「新鮮的」。年齡值爲 ,按第13.2.3節的規定計算。

    也許你可以用它來計算在服務器上處理請求所用的時間。

你也可以通過添加一些代碼到你的Module.php像這樣在你的ZF2應用程序中添加自定義標題:

function onBootstrap(MvcEvent $event) { 
    $application = $event->getApplication(); 
    $eventManager = $application->getEventManager(); 
    $eventManager->attach(MvcEvent::EVENT_FINISH, [$this, 'addTimeHeader']); 

    //... 
} 

function addTimeHeader(MvcEvent $event) { 
    $time = // get your time value 
    $response = $event->getResponse(); 
    $response->getHeaders()->addHeaderLine('X-Request-Time', $time); 
} 

問題仍然會得到您的視圖中該數據。如果您使用AJAX請求,將很容易從響應中獲取標題,但如果您不使用AJAX,則是完全不同的故事。閱讀更多here in this answer

+1

這真的很有價值的答案:) – tasmaniski

+0

@tasmaniski謝謝,它實際上也是一個有趣的問題:) – Wilt

+0

這真的是一個很有價值的答案@tasmaniski說,很好的信息,我沒有標記它的唯一原因是因爲我用了一些東西否則這有點不同,但謝謝你! –

0

如果你想成爲一個真正的骯髒,在開始時添加在您的index.php文件:

$_GET['the_time'] = round(microtime(true) * 1000); 

無論你在視圖或佈局打印想:

echo round(microtime(true) * 1000) - $_GET['the_time']; 
// Use $_GET as global variable 

注:其餘的開發者可能會討厭你。

0

您可以捕獲時間變量在index.php中,然後用register_shutdown_function打印時間差:

index.php

define('APP_START_TIME', microtime(true)); 

register_shutdown_function(function(){ 
echo 'Request time(sec): ' . number_format(microtime(true) - APP_START_TIME, 3); 
});