У меня запущен скрипт php и с помощью cURL вы можете получить содержимое веб-страниц, на которых я хочу проверить наличие какого-либо текста.
Сейчас это выглядит так:
for( $i = 0; $i < $num_target; $i++ ) { $ch = curl_init(); $timeout = 10; curl_setopt ($ch, CURLOPT_URL,$target[$i]); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ch, CURLOPT_FORBID_REUSE, true); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $url = curl_exec ($ch); curl_close($ch); if (preg_match($text,$url,$match)) { $match[$i] = $match; echo "text" . $text . " found in URL: " . $url . ": " . $match .; } else { $match[$i] = $match; echo "text" . $text . " not found in URL: " . $url . ": no match"; } }
Мне было интересно, могу ли я использовать специальную настройку cURL, которая делает ее быстрее (я смотрел в руководстве по php, выбрал варианты, которые казались мне лучше, но я, возможно, пренебрег некоторыми, что может увеличить скорость и производительность скрипта).
Тогда мне стало интересно, может ли использование cgi, Perl или python (или другого решения) быть быстрее php.
Заранее благодарю за любую помощь / совет / предложение.
Вы можете использовать curl_multi_init
…. который позволяет обрабатывать несколько ручек cURL параллельно.
пример
$url = array(); $url[] = 'http://www.huffingtonpost.com'; $url[] = 'http://www.yahoo.com'; $url[] = 'http://www.google.com'; $url[] = 'http://technet.microsoft.com/en-us/'; $start = microtime(true); echo "<pre>"; print_r(checkLinks($url, "Azure")); echo "<h1>", microtime(true) - $start, "</h1>";
Вывод
Array ( [0] => http://technet.microsoft.com/en-us/ ) 1.2735739707947 <-- Faster
Используемая функция
function checkLinks($nodes, $text) { $mh = curl_multi_init(); $curl_array = array(); foreach ( $nodes as $i => $url ) { $curl_array[$i] = curl_init($url); curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true); curl_setopt($curl_array[$i], CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)'); curl_setopt($curl_array[$i], CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($curl_array[$i], CURLOPT_TIMEOUT, 15); curl_multi_add_handle($mh, $curl_array[$i]); } $running = NULL; do { usleep(10000); curl_multi_exec($mh, $running); } while ( $running > 0 ); $res = array(); foreach ( $nodes as $i => $url ) { $curlErrorCode = curl_errno($curl_array[$i]); if ($curlErrorCode === 0) { $info = curl_getinfo($curl_array[$i]); if ($info['http_code'] == 200) { if (stripos(curl_multi_getcontent($curl_array[$i]), $text) !== false) { $res[] = $info['url']; } } } curl_multi_remove_handle($mh, $curl_array[$i]); curl_close($curl_array[$i]); } curl_multi_close($mh); return $res; }