J
J
Jony13372017-01-02 17:10:55
PHP
Jony1337, 2017-01-02 17:10:55

Why php script freezes after 10k iterations?

Hello, I have this code.

<?
 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); 


?>

as you can see everything starts from 3M to 3000040 , everything works but if you set from 3M to 3005040 it can work, it can display 505 error . I immediately tried 10k iterations, it worked, I decided to do it again and it already works.
All this happens on a VPS 1GB RAM , Debian x86 .
php-memory-limit -> local value 512M (was 128 set 512 by myself) , Master Value 128M
The problem is that this is too much load?
Not enough RAM?
If after each iteration to do sleep (1) will it reduce the load?

Answer the question

In order to leave comments, you need to log in

3 answer(s)
K
kazmiruk, 2017-01-03
@kazmiruk

Because you wrote, to put it mildly, shitty code that eats up all the memory. Asking for 10k results and writing them all into one array is a very bad idea. You remove saving the intermediate result, the function simply returns true / false and is called 10k times, or 100k. And in our case, a function is called into which a huge array is passed and an even larger array is returned.

A
Anton Shamanov, 2017-01-02
@SilenceOfWinter

script execution time is also limited

A
Arman, 2017-01-02
@Arik

similar to "10k problem", if there are accesses, then check the connections at the time of the script execution

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question