2011-09-05 62 views
2

我很想知道這個腳本是否很好地知道php腳本的執行情況?我們如何知道腳本的執行時間? OOP

爲毫秒

<?php 
$timestart = microtime(true); 
/* Blah Blah here ... */ 
$timeend = microtime(true); 
echo 'Execution Time : '.round((timeend - timestart) * 1000, 2); 
?> 

我沒有任何有關使用OOP(面向對象編程)與它的想法。

此外,我會做一個腳本誰將解析一個文本文件(.txt),我可能有120 - 700行,哪種方式更好地知道數據處理?

時間取決於行數?

+3

您可以使用OOP的「等等等等在這裏」塊內不改變任何東西 –

+0

這就是我通常做的,但是,對於較大的項目,如果你想要確切的時間。然後確保$ timestart早期調用並且在一個小的PHP文件中很重要,因爲甚至包括PHP文件也會很慢。另外,如果您使用的是PHP 5.3,我相信(或者更新的版本),那麼頁面請求時間戳已經更改爲microtime「format」...意味着更精確並且不需要$ timestart。 – Andreas

+0

謝謝你們兩位。使用它真的很有趣嗎?或者只有當我們想要分析腳本執行的時間時。 – Zeroth

回答

3

我使用這個我前段時間寫的Timer類。一個好處是,它是「增量」,你可以在一個循環內啓動一個定時器,它會追加開始和停止之間的時間。

請注意,如果你這樣做,它將有相當一段時間來執行。 基本用法:

$myTimer = new Timer(); 
$myTimer->start('hello'); // $myTimer = new Timer('hello'); is a shorthand for this. 
for ($i=0; $i<100000; $i++) 
{ 
    $myTimer->start('slow suspect 1'); 
    // stuff 
    $myTimer->stop('slow suspect 1');  

    $myTimer->start('slow suspect 2'); 
    // moar stuff 
    $myTimer->stop('slow suspect 2');  
} 
$myTimer->stop('hello'); 
$myTimer->print_all(); 

請注意它是有限的,遠遠沒有做到這一點的最快方式。創造和脫落的課程需要時間。當在「邏輯」循環內完成時,它可以增加相當長的一段時間。但追查一些複雜的程序有多個疊瓦狀循環,或者遞歸函數調用,這東西是珍貴

<?php 
class Timer_ 
{ 
    public $start; 
    public $stop; 
    public function __construct() 
    { 
     $this->start = microtime(true); 
    } 
} 

class Timer 
{ 
    private $timers = array(); 

    public function __construct($firsTimer=null) 
    { 
     if ($firsTimer != null) $this->timers[$firsTimer][] = new Timer_(); 
    } 

    public function start($name) 
    { 
     $this->timers[$name][] = new Timer_(); 
    } 

    public function stop($name) 
    { 
     $pos = count($this->timers[$name]) -1 ; 
     $this->timers[$name][$pos]->stop = microtime(true); 
    } 

    public function print_all($html=true) 
    { 
     if ($html) echo '<pre>'; 

     foreach ($this->timers as $name => $timerArray) 
     { 
      $this->print_($name, $html); 
     } 

     if ($html) echo '</pre>'; 
    } 

    public function print_($name, $html=true) 
    { 
     $nl = ($html) ? '<br>' : NEWLINE; 
     $timerTotal = 0; 
     foreach ($this->timers[$name] as $key => $timer) 
     { 
      if ($timer->stop != null) 
      { 
       $timerTotal += $timer->stop - $timer->start; 
      } 
     } 
     echo $name, ': ', $timerTotal, $nl; 

    } 
} 
?> 
+0

謝謝! 以及每個頁面的時間安排是什麼?

<?php echo round((getMicroTime() - $ _SERVER ['REQUEST_TIME'])* 1000)?> ms。

是好還是我可以找到更好的? – Zeroth

1

如果你想以OO的方式做到這一點,你可以有一個類,你從哪裏開始。

$timer->start('piece1'); 
//code1 
$timer->stop('piece1'); 
echo 'Script piece1 took '.$timer->get('piece1').' ms'; 

我相信它在codeigniter框架中就是這樣做的。

這些名稱('piece1')的要點是您可以同時運行多個定時器(例如在另一個示例中)。用於實施的代碼非常簡單,大約有10行。

+0

謝謝。 另外,我會做一個腳本誰將解析一個文本文件(.txt),我可能有120 - 700行,哪種方式更好地知道數據處理? – Zeroth

相關問題