Функциональный тест Symfony 1.4 — уменьшите использование памяти

У меня есть CSV-файл, который определяет маршруты для тестирования, и ожидаемый код состояния должен возвращаться каждый маршрут.

Я работаю над функциональным тестом, который перебирает 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 будет добавлено больше маршрутов.

Есть ли способ уменьшить объем памяти, который использует этот тест?

2

Решение

Я столкнулся с той же проблемой нехватки памяти. Мне нужно было просканировать очень длинный список URI (около 30 КБ), чтобы сгенерировать кеш 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 определяет количество URI, которое будет сканироваться sfBrowser в каждом процессе. Вы можете уменьшить его, если у вас все еще есть проблемы с памятью

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]