2015-04-14 114 views
2

我有一個csv文件,它定義了要測試的路由,並且每個路由的預期狀態碼應該返回。Symfony 1.4功能測試 - 減少內存使用量

我正在對csv文件進行迭代並向每個路由發出請求的功能測試,然後檢查是否返回了正確的狀態碼。

$browser = new sfTestFunctional(new sfBrowser()); 

foreach ($routes as $route) 
{ 
    $browser-> 
     get($route['path'])-> 

     with('response')->begin()-> 
      isStatusCode($route['code'])-> 
     end() 
    ; 
    print(memory_get_usage()); 
} 

/*************** OUTPUT: ************************* 

ok 1 - status code is 200 
97953280# get /first_path 
ok 2 - status code is 200 
109607536# get /second_path 
ok 3 - status code is 403 
119152936# get /third_path 
ok 4 - status code is 200 
130283760# get /fourth_path 
ok 5 - status code is 200 
140082888# get /fifth_path 
... 

/***************************************************/ 

這一直持續到我得到允許的內存耗盡錯誤。

我增加了允許的內存量,它暫時解決了這個問題。這不是一個永久的解決方案,因爲隨着時間的推移,更多的路由將被添加到csv文件。

有沒有辦法減少這個測試使用的內存量?

+0

這張票可能是相關的:http://trac.symfony-project.org/ticket/6621 – acleitner

+0

沒有機會。可能的解決方案是將每個路由測試作爲單獨的php進程運行。 – Marek

+0

任何新聞? '也就是說,它已經在PHP 5.3中修復了。 '但我有PHP 5.3。 –

回答

0

我面臨同樣的內存不足問題。我需要抓取非常長的URI列表(大約30K)來生成HTML緩存。感謝Marek,我試圖分叉處理。仍然有一點泄漏,但這是微不足道的。

作爲一個輸入,我有一個文本文件,每個URI有一行。當然,您可以輕鬆地使用CSV來修改以下腳本。

const NUMBER_OF_PROCESS = 4; 
const SIZE_OF_GROUPS = 5; 

require_once(dirname(__FILE__).'/../../config/ProjectConfiguration.class.php'); 
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false); 
sfContext::createInstance($configuration); 

$file = new SplFileObject(dirname(__FILE__).'/list-of-uri.txt'); 

while($file->valid()) 
{ 
    $count = 0; 
    $uris = array(); 
    while($file->valid() && $count < NUMBER_OF_PROCESS * SIZE_OF_GROUPS) { 
     $uris[] = trim($file->current()); 
     $file->next(); 
     $count++; 
    } 
    $urisGroups = array_chunk($uris, SIZE_OF_GROUPS); 

    $childs = array(); 
    echo "---\t\t\t Forking ".sizeof($urisGroups)." process \t\t\t ---\n"; 
    foreach($urisGroups as $uriGroup) { 
     $pid = pcntl_fork(); 
     if($pid == -1) 
      die('Could not fork'); 
     if(!$pid) { 
      $b = new sfBrowser(); 
      foreach($uriGroup as $key => $uri) { 
       $starttime = microtime(true); 
       $b->get($uri); 
       $time = microtime(true) - $starttime; 
       echo 'Mem: '.memory_get_peak_usage().' - '.$time.'s - URI N°'.($key + 1).' PID '.getmypid().' - Status: '.$b->getResponse()->getStatusCode().' - URI: '.$uri."\n"; 
      } 
      exit(); 
     } 
     if($pid) { 
      $childs[] = $pid; 
     } 
    } 

    while(count($childs) > 0) { 
     foreach($childs as $key => $pid) { 
      $res = pcntl_waitpid($pid, $status, WNOHANG); 

      // If the process has already exited 
      if($res == -1 || $res > 0) 
       unset($childs[$key]); 
     } 
     sleep(1); 
    } 
} 

const NUMBER_OF_PROCESS是定義並行進程的工作的數量(因此,可以節省時間,如果你有一個多核處理器)

const NUMBER_OF_PROCESS是定義將由sfBrowser在每個被抓取URI的數量處理。如果你仍然有內存不足的問題,你可以減少它