Реализации ping-а

Статус
В этой теме нельзя размещать новые ответы.

Leonid777

Постоялец
Регистрация
16 Мар 2007
Сообщения
97
Реакции
5
Профи, подскажите плиз. :bc:

Вот две функции, которые впринципе должны делать одно и тоже, только разными методами:
Функция 1:
PHP:
<?

ping ("http://ping.blogs.yandex.ru/RPC2", "Pupkin","http://pupkin.net/");
// ping ("http://ping.feedburner.com/RPC2", "Pupkin","http://pupkin.net/");

function ping ($url, $blogname, $blogurl)
{

$tb_send='<?xml version="1.0"?>
<methodCall>
	<methodName>weblogUpdates.ping</methodName>
	<params>
		<param>
			<value>'.$blogname.'</value>
		</param>
		<param>
			<value>'.$blogurl.'</value>
		</param>
	</params>
</methodCall>';

		$target=parse_url($url);

        $tb_sock = fsockopen($target["host"],  80); 
        fputs($tb_sock, "POST " . $target["path"] . $target["query"] . " HTTP/1.1\r\n");
        fputs($tb_sock, "User-Agent: Pupkin.net\r\n");
		fputs($tb_sock, "Host: " . $target["host"] . "\r\n");
        fputs($tb_sock, "Content-Type: text/xml\r\n");
        fputs($tb_sock, "Content-length: " . strlen($tb_send) . "\r\n");
        fputs($tb_sock, "Connection: close\r\n\r\n");
        fputs($tb_sock, $tb_send); 
        // Gather result
        while (!feof($tb_sock)) {
            $response .= fgets($tb_sock, 128);
        } 
        // Close socket
        fclose($tb_sock); 
        // Did the trackback ping work
        strpos($response, '<error>0</error>') ? $return = true : $return = false; 
        // send result
        return $return;
   } 

?>

И функция 2:

PHP:
<?php 

$blogname = "Блог Пупкина";
$blogurl = "xttp://pupkin.net/";

# Using the XML-RPC extension to format the XML package
$request = xmlrpc_encode_request("weblogUpdates.ping", array($blogname, $blogurl) );

# Using the cURL extension to send it off,
# first creating a custom header block
$header[] = "Host: rpc.technorati.com";
$header[] = "Content-type: text/xml";
$header[] = "Content-length: ".strlen($request) . "\r\n";
$header[] = $request;

$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, "http://rpc.technorati.com/rpc/ping"); # URL to post to
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt( $ch, CURLOPT_HTTPHEADER, $header ); # custom headers, see above
curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'POST' ); # This POST is special, and uses its specified Content-type
$result = curl_exec( $ch ); # run!
curl_close($ch);

echo $result;
?>
Меня интересует, какая из них будет быстрее работать и жрать меньше системных ресурсов. + Какая из них, на Ваш взгляд наиболее эффективна?
 
Думаю что 2я так как реализована с использованием CURL
 
Раз уж скрипты выполняют одно и то же (для одного и того же запроса), то я, на месте ТС, сделал бы банальную проверку скриптов в работе с измерением microtime(), поочередно, для случаев так... не менее ста :) и по среднему значению для каждого сделал бы некоторые выводы.

Ну а из предположений... Мне тоже кажется курл может быть поудачнее.
 
не знаю насчет курла, но хостеры любят отключать fsockopen. поэтому первый вариант заведомо непереносим и второй стоит выбрать уже по этой причине.

если вопрос переносимости не ставится, уверен, что принципиальной разницы во времени выполнения/ресурсах приведенных вариантов нет.
 
сокеты могут быть быстрее, если "спамить в несколько потоков".
а так оба решения одинаково медленные -
ведь основное время - это отсылка/ожидание ответа сети
 
сокеты могут быть быстрее, если "спамить в несколько потоков".
а так оба решения одинаково медленные -
ведь основное время - это отсылка/ожидание ответа сети
Ок. А можешь подсказать какую-либо альтернативу?
 
Ок. А можешь подсказать какую-либо альтернативу?
Если нужно на php послать запрос и получить ответ, то иного пути нет.
Если нужно выполнять периодически и для одного хоста - то особых проблем не должно быть...
Но, похоже, раз вопрос стоит о производительности, то дело, значит, будет "на поток"... В общем, если скрипт будет запускаться много раз и одновременно (т.е. параллельная работа) то для уменьшения ресурсоёмкости лучше будет переписать с CURL_MULTI...
А вообще, лучше смотреть в сторону С++ с pthreads :)
 
Загрузка в несколько потоков с multi_curl и PHP
Для просмотра ссылки Войди или Зарегистрируйся
Оказалось, что самое простое решение - это multi_curl. Но его на форумах очень критикуют за то, что он ест слишком много памяти, глючит и вообще безобразничает. Есть ещё вариант - неблoкирующие сокеты, но мне они показались более сложными. Ну, а самое правильное, решение - это pkg_delete php, pkg_add perl :) Потому что Perl для этого задуман, а PHP - нет. Но ради единоразовой операции, хоть и длительной, пересиливать свою необъяснимую нелюбовь к Perl я не стал. Тем более пишут, что если ставить немного потоков (до 100), то multi_curl будет нормально работать.
 
Но его на форумах очень критикуют за то, что он ест слишком много памяти
Имхо. Для пхп 5.0.x, где мультикурл был только отрелизен глюков было полно. К версии 5.2.х уже всё намного лучше :)
Кстати, в курл прилично было добавлено, говоря словами разработчиков "Available since PHP 5.1.0", так что раньше этой версии лучше не юзать. Для просмотра ссылки Войди или Зарегистрируйся
 
Ок. Дайвайте внсем некоторую ясность в то, для чего будет использован один из вышеуказанных кодов(т.е. наиболее эффективный).

Вот список нескольких url-ов для пинга(т.е. сообщения об обновлениии блога:(
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся

Ну и запустив один из вышеуказанных кодов в цикле, я хочу чтобы он последовательно (или паралельно - правда я понятия не имею как реализуется паралельные соединения)
передал по вышеуказанным url-ам информацию об обновлении блога.

Дак вот вопрос стоит в следующем - как этот процесс реализовать наиболее эффективным образом - т.е. чтобы он не жрал много ресурсов у хостера и справился с работой максимально быстро?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху