@Jony1337

Почему php скрипт зависает после 10к итераций?

Привет , есть такой код .
<?
 ini_set('max_execution_time', 900);
 $start = microtime(true);
function multiRequest($data, $options = array()) {
 
  // array of curl handles
  $curly = array();
  // data to be returned
  $result = array();
 
  // multi handle
  $mh = curl_multi_init();
 
  // loop through $data and create curl handles
  // then add them to the multi-handle
  foreach ($data as $id => $d) {
 
    $curly[$id] = curl_init();
 
    $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
    curl_setopt($curly[$id], CURLOPT_URL,            $url);
    curl_setopt($curly[$id], CURLOPT_HEADER,         0);
    curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);
 
    // post?
    if (is_array($d)) {
      if (!empty($d['post'])) {
        curl_setopt($curly[$id], CURLOPT_POST,       1);
        curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
      }
    }
 
    // extra options?
    if (!empty($options)) {
      curl_setopt_array($curly[$id], $options);
    }
 
    curl_multi_add_handle($mh, $curly[$id]);
  }
 
  // execute the handles
  $running = null;
  do {
    curl_multi_exec($mh, $running);
  } while($running > 0);
 
 
  // get content and remove handles
  foreach($curly as $id => $c) {
    $result[$id] = curl_multi_getcontent($c);
    curl_multi_remove_handle($mh, $c);
  }
 
  // all done
  curl_multi_close($mh);
  return $result;
}
 for ($i = 3000000 ; $i <= 3000040; $i++)  {
 $next = 'https:/example.ru/tr/'.$i;
 $data[$i] = $next;
 }
 
 $r = multiRequest($data); 
$kr = count($r) + 3000000;

 for ($b = 3000000 ; $b <= $kr; $b++){

 	if (strpos($r[$b], 'window.trackErrorPage') !== false) 

{
    
	$inexistente [] = $b;
} 

else {

	$existente [] = $b;
}  

} 
$tm = microtime(true) - $start;
echo $tm;
echo "<hr>";
echo "True ".count($existente); 
echo "<hr>";
echo "False =  ".count($inexistente); 


?>

как видите всё начинается с 3M до 3000040 , всё работает но если задавать от 3М до 3005040 может сработать , может вывести 505 error . Сразу попробовал 10к итераций сработало , решил сделать повторно и уже на работает .
Всё это происходит на VPS 1гб оперативки , Debian x86 .
php-memory-limit - > local value 512M (было 128 поставил сам 512) , Master Value 128M
Проблема в том что это слишком большая нагрузка ?
Не достаточно оперативки ?
Если после каждой итераций сделать sleep(1) это снизит нагрузку ?
  • Вопрос задан
  • 1066 просмотров
Пригласить эксперта
Ответы на вопрос 3
@kazmiruk
Потому что вы написали мягко говоря говнокод, который сжирает всю память. Спросить 10к результатов и записать их все в один массив очень плохая идея. Убираете сохранение промежуточного результата, функция просто возвращает true/false и вызывается 10к раз, или 100к. А в нашем случае вызывается функция в которую передается огромный массив и возвращается еще более огромный массив.
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
время выполнения скрипта тоже ограничено
Ответ написан
@Arik
похожа на "10k problem", если доступы есть то проверьте соединения на момент выполнения скрипта
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы