Задать вопрос
@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) это снизит нагрузку ?
  • Вопрос задан
  • 1080 просмотров
Подписаться 2 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 3
@kazmiruk
Потому что вы написали мягко говоря говнокод, который сжирает всю память. Спросить 10к результатов и записать их все в один массив очень плохая идея. Убираете сохранение промежуточного результата, функция просто возвращает true/false и вызывается 10к раз, или 100к. А в нашем случае вызывается функция в которую передается огромный массив и возвращается еще более огромный массив.
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
время выполнения скрипта тоже ограничено
Ответ написан
@Arik
похожа на "10k problem", если доступы есть то проверьте соединения на момент выполнения скрипта
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽