2017-02-21 28 views
1

Я надеюсь, что вы можете помочь мне оптимизировать и ускорить выполнение сценария, который я написал для извлечения данных для нескольких источников. В настоящее время сценарий имеет тенденцию занимать от 2 до 10 минут для запуска в зависимости от времени суток.Выполнять несколько запросов POST параллельно, улучшать и оптимизировать скорость скрипта. Возможно многопоточность?

Всякая помощь была бы очень исправна.

Объясняя сценарий:
Я использую цикл Еогеасп для запуска через пять различных URL-адресов, и каждый URL будет иметь пять запросов POST, выполняемых с результирующие данные записываются в файл.

Что я надеюсь:
Чтобы улучшить скорость работы скрипта я надеялся, что это было бы возможно, чтобы каждый из пяти URL-адресов в рамках отдельных функций и затем запустить эти пять функций параллельны друг другу ,

Один из вариантов, о которых я читал, это pcntl_fork, может ли это быть использовано для достижения того, что мне нужно? Если нет, есть ли другие варианты?

Мой сценарий:

foreach($urls as $url){ 
     $firmato = file_get_html($url, false, stream_context_create($firmato_request)); 
     if (preg_match('(record totali ([\d]+))', $firmato, $count)) { 
      $firmato_count = $count[1]; 
     }; 
     $inviato = file_get_html($url, false, stream_context_create($inviato_request)); 
     if (preg_match('(record totali ([\d]+))', $inviato, $count)) { 
      $inviato_count = $count[1]; 
     }; 
     $positive = file_get_html($url, false, stream_context_create($positive_request)); 
     if (preg_match('(record totali ([\d]+))', $positive, $count)) { 
      $positive_count = $count[1]; 
     }; 
     $negative = file_get_html($url, false, stream_context_create($negative_request)); 
     if (preg_match('(record totali ([\d]+))', $negative, $count)) { 
      $negative_count = $count[1]; 
     }; 
     $total = file_get_html($url, false, stream_context_create($default_request)); 
     if (preg_match('(record totali ([\d]+))', $total, $count)) { 
      $default_count = $count[1]; 
      $other_count = $firmato_count+$inviato_count+$positive_count+$negative_count-$default_count; 
     }; 

     if ($url == 'http://sourceOne.com/MessageServlet') { 
      $cacheDir = 'cache/one/'; 
     } elseif ($url == 'http://sourceTwo.com/MessageServlet') { 
      $cacheDir = 'cache/two/'; 
     } elseif ($url == 'http://sourceThree.com/MessageServlet') { 
      $cacheDir = 'cache/three/'; 
     } elseif ($url == 'http://sourceFour.com/MessageServlet') { 
      $cacheDir = 'cache/four/'; 
     } elseif ($url == 'http://sourceFive.com/MessageServlet') { 
      $cacheDir = 'cache/five/'; 
     } 
     $cache_file = $cacheDir.'hour_'.sprintf('%02d', $previousHour).'.txt'; 
     $data = '<tr><td>'.sprintf('%02d', $previousHour).':00</td><td>'.$firmato_count.'</td><td>'.$inviato_count.'</td><td>'.$positive_count.'</td><td>'.$negative_count.'</td><td>'.$other_count.'</tr>'; 
     file_put_contents($cache_file, $data); 
}; 
+0

Здесь вы найдете несколько полезных ответов о многопоточности в PHP: http://stackoverflow.com/questions/70855/how-can-one-use-multi-threading-in-php-applications – Oliver

+0

Фактически, есть слишком много возможных ответов на ваш вопрос. НАПРИМЕР. вы можете использовать curl, что немного быстрее, чем file_get_contents, и это еще быстрее, но сложнее реализовать, чтобы создать bash-скрипт на вашем Linux-Mashine, который будет вызываться только PHP. – Oliver

+0

http://codereview.stackexchange.com/help/on-topic – mickmackusa

ответ