2012-04-18 42 views
5

Tôi muốn tạo trang trạng thái cho ứng dụng của mình bằng cách sử dụng symfony2 nơi tôi muốn in thời gian thực hiện (cùng với các dữ liệu khác) của yêu cầu cụ thể. Tôi không thể tìm thấy anyway để làm điều này.symfony2 - Nhận thời gian thực hiện

tôi biết rằng tôi có thể theo dõi thời gian thực hiện một phần mã với:

$starttime = microtime(); 
// do something 
$duration = microtime() - $starttime; 

Nhưng vì lý do rõ ràng tôi không thể đặt nó trong bộ điều khiển, như toàn bộ bootstrap sẽ không được theo dõi. Ngoài ra, việc hiển thị mẫu sẽ không được bao gồm.

Có cách nào để đến gần hết thời gian thực thi của tập lệnh không?

+0

Còn hệ thống định dạng dựng sẵn thì sao? Nó sẽ có nhiều tính năng tuyệt vời hơn trong 2.1, chẳng hạn như đồ thị thời gian chi tiết, hơi giống với biểu đồ của firebug và webkit. – gilden

+0

Tôi muốn thực hiện điều này trong môi trường sản xuất trên một trang đặc biệt. Ngay bây giờ tôi không có cái nhìn sâu sắc như thế nào profiler hoạt động. Tôi có thể chỉ "kích hoạt" bằng cách nào đó khi tôi phục vụ một hành động và không có tác động đến hiệu suất trên tất cả các hành động khác không? – Sgoettschkes

+0

Đối với hồ sơ trên một máy chủ sản xuất, có thể bạn sẽ muốn nhìn vào xhprof ... – greg0ire

Trả lời

8

Tôi đã tìm được cách mà tôi cho là phù hợp với trường hợp sử dụng của chúng tôi. Tôi tạo ra một performance.php mới tập tin trong thư mục web mà trông như thế này:

<?php 
/** 
* This file is only used for doing realtime performance measurement 
* Right now only the microtime is calculated, but in the future the 
* xhproof module could be used: http://de2.php.net/manual/en/book.xhprof.php 
* 
* MAKE SURE TO NOT USE THIS FILE IN PRODUCTION FOR OTHER STUFF THAN REAL TIME 
* PERFORMANCE MEASUREMENT 
*/ 

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

require_once __DIR__.'/app.php'; 

Tôi cũng đăng ký một phần mở rộng cành lá trong đó sử dụng toàn cầu và tính toán thời gian đã trôi qua:

<?php 

namespace Acme\DemoBundle\Extension; 

class PerformanceTwigExtension extends \Twig_Extension { 

    public function getFunctions() { 
     return array(
      'performance_exectime' => new \Twig_Function_Method($this, 'getExecTime') 
     ); 
    } 

    public function getExecTime() { 
     if (!isset($GLOBALS['PerformanceTwigExtensionMicrotime'])) { 
      return 0; 
     } 

     $durationInMilliseconds = (microtime(true) - $GLOBALS['PerformanceTwigExtensionMicrotime']) * 1000; 
     return number_format($durationInMilliseconds, 3, '.', ''); 
    } 

    public function getName() { 
     return "performance_extension"; 
    } 

} 

Khi chúng ta muốn để thực hiện một số phép đo hiệu suất, chúng tôi chỉ có thể sử dụng performance.php. Mẫu gọi hàm và sau đó có thể hiển thị thời gian thực hiện:

{{ performance_exectime() }} 

Nó ra 0 nếu thời gian bắt đầu không được thiết lập (ví dụ như khi app.php bình thường được sử dụng), vì vậy nó là an toàn để sử dụng trong mọi trường hợp . Mặt khác, nếu ai đó quyết định sử dụng performance.php như một điểm vào, nó không nên phá vỡ bất cứ điều gì vì chỉ có một biến toàn cầu là khác nhau.

+0

Đây là một ý tưởng tuyệt vời! (Xem xét việc chuyển nó thành một mục wiki.) –

1

Kể từ PHP 5.4 chúng ta có thể làm microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']

Làm thế nào để sử dụng trong Symfony2:

src/AppBundle/Twig/AppExtension.php

<?php 

namespace AppBundle\Twig; 

class AppExtension extends \Twig_Extension 
{ 
    public function getFunctions() 
    { 
     return [ 
      new \Twig_SimpleFunction('request_time', [$this, 'requestTime'], ['is_safe' => ['html']]), 
     ]; 
    } 

    public function requestTime($decimals = 3) 
    { 
     return number_format(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], $decimals); 
    } 

    public function getName() 
    { 
     return 'app_extension'; 
    } 
} 

theo quan điểm:

<footer class="footer"> 
    <div class="container"> 
     <p class="text-muted">{{ request_time() }}s</p> 
    </div> 
</footer> 

trong app/config/services.yml:

services: 
    app.twig_extension: 
     class: AppBundle\Twig\AppExtension 
     public: false 
     tags: 
      - { name: twig.extension } 
Các vấn đề liên quan