Я надеюсь, что вы можете помочь мне оптимизировать и ускорить выполнение сценария, который я написал для извлечения данных для нескольких источников. В настоящее время сценарий имеет тенденцию занимать от 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);
};
Здесь вы найдете несколько полезных ответов о многопоточности в PHP: http://stackoverflow.com/questions/70855/how-can-one-use-multi-threading-in-php-applications – Oliver
Фактически, есть слишком много возможных ответов на ваш вопрос. НАПРИМЕР. вы можете использовать curl, что немного быстрее, чем file_get_contents, и это еще быстрее, но сложнее реализовать, чтобы создать bash-скрипт на вашем Linux-Mashine, который будет вызываться только PHP. – Oliver
http://codereview.stackexchange.com/help/on-topic – mickmackusa