Curl vs sockets vs file_get_contents vs multiCurl

Давайте же проведем небольшое сравнение в скорости.

1) Curl

< ?
function curl($url)
{
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,$url);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($ch);
curl_close($ch);
return $result;
}

2) Sockets

function sockets($host) {
$fp = fsockopen("www.".$host, 80, $errno, $errstr, 30);
  $out = "GET / HTTP/1.1\r\n";
  $out .= "Host: www.".$host."\r\n";
  $out .= "Connection: Close\r\n\r\n";
  fwrite($fp, $out);
  $f='';
  while (!feof($fp)) {
    $f .= fgets($fp, 1024);
  }
return $f;
}

3) file_get_contents

function fgc($url){
return file_get_contents($url);
}

4) MultiCurl

function multiRequest($data,$nobody=false,$options = array(), $oneoptions = array())
{
	$curls = array();
	$result = array();
	$mh = curl_multi_init();
	foreach ($data as $id => $d)
	{
		$curls[$id] = curl_init();
		$url = (is_array($d) &amp;&amp; !empty($d['url'])) ? $d['url'] : $d;
		curl_setopt($curls[$id], CURLOPT_URL,            $url);
		curl_setopt($curls[$id], CURLOPT_HEADER,         0);
		curl_setopt($curls[$id], CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curls[$id], CURLOPT_FOLLOWLOCATION,1);
		curl_setopt($curls[$id], CURLOPT_USERAGENT,"Mozilla/5.0(Windows;U;WindowsNT5.1;ru;rv:1.9.0.4)Gecko/2008102920AdCentriaIM/1.7Firefox/3.0.4");
		//curl_setopt($curls[$id], CURLOPT_COOKIEJAR,'cookies.txt');
		//curl_setopt($curls[$id], CURLOPT_COOKIEFILE,'cookies.txt');
		//curl_setopt($curls[$id], CURLOPT_NOBODY, $nobody);

		if (!empty($options))
		{
			curl_setopt_array($curls[$id], $options);
		}
		if (!empty($oneoptions[$id]))
		{
			curl_setopt_array($curls[$id], $oneoptions[$id]);
		}
		if (is_array($d))
		{
			if (!empty($d['post']))
			{

				curl_setopt($curls[$id], CURLOPT_POST,       1);
				curl_setopt($curls[$id], CURLOPT_POSTFIELDS, $d['post']);
			}
		}
		curl_multi_add_handle($mh, $curls[$id]);
	}
	$running = null;
	do
	{
		curl_multi_exec($mh, $running);
	}
	while($running > 0);
	foreach($curls as $id => $content)
	{
		$result[$id] = curl_multi_getcontent($content);
		//echo curl_multi_getcontent($content);
		curl_multi_remove_handle($mh, $content);
	}
	curl_multi_close($mh);
	return $result;
}

В качестве теста получим страницу "http://google.de" сто раз.

$url = 'google.de';
$start = microtime(1);
for($i=0;$i&lt;100;$i++)
curl($url);
$end = microtime(1);
echo "Curl:".($end-$start)."\n";

$start = microtime(1);
for($i=0;$i&lt;100;$i++)
fgc("http://$url/");
$end = microtime(1);
echo "file_get_contents:".($end-$start)."\n";

$start = microtime(1);
for($i=0;$i&lt;100;$i++)
sockets($url);
$end = microtime(1);
echo "Sockets:".($end-$start)."\n";

$start = microtime(1);
for($i=0;$i&lt;100;$i++)
$arr[]=$url;
multiRequest($arr);
$end = microtime(1);
echo "MultiCurl:".($end-$start)."\n";
?>

Результаты:

Curl: 5.39667105675
file_get_contents: 7.99799394608
Sockets: 2.99629592896
MultiCurl: 0.736907958984

Как видим, лидирует мультикурл, беспощадно оставляя своих соперником далеко позади. Применять multicurl стоит лишь тогда, когда имеется объемное количество url'ов.
Иначе, если список "страниц", которые необходимо "посетить" небольшой(2,3,5,10), самый рациональный вариант - использовать сокеты, но..кому как, мне например, несмотря на то, что т socket'ы выигрывают у curl'а, удобнее использовать его, т.к нет проблем с заголовками(headers) и прочим.

Что выбрать? Решать только вам.

    • bula1
    • Март 21st, 2011 16:08

    >>for($i=0;$i< ;100;$i++)
    ошибка жэ
    for($i=0;$i<=100;$i++)// =)

      • bula1
      • Март 21st, 2011 16:12

      ах да, в 4 блоке function multiRequest
      а в 5 блоке вызывается функция MultiCurl($arr)

        • #Wolf#
        • Март 21st, 2011 16:21

        bula1 :

        >>for($i=0;$i< ;100;$i++)
        ошибка жэ
        for($i=0;$i<=100;$i++)// =)

        Парсер съел.

        bula1 :

        ах да, в 4 блоке function multiRequest
        а в 5 блоке вызывается функция MultiCurl($arr)

        Спасибо, поправил.

    • Shoomer
    • Ноябрь 27th, 2011 17:57

    row 44
    ">" -> "=>"

    • #Wolf#
    • Ноябрь 27th, 2011 18:02

    Shoomer :

    row 44
    ">" -> "=>"

    Спасибо, парсер съел.

    • #Wolf#
    • Апрель 3rd, 2012 19:23

    "кавычки"

*

 
http://wolf-et.ru/wp-admin/page/library/