CURL или file_get_contents для обновления списка каналов? - PullRequest
5 голосов
/ 21 сентября 2011

У меня есть сайт для чтения каналов, где будет много RSS. Мне придется синхронизировать эти каналы как можно чаще, поэтому я нашел два способа сделать это.

1 метод: Использование CURL

$weblog_name = 'MyBlog';
$weblog_url = 'http://feeds.feedburner.com/myblog';
$ping_url = 'http://ping.feedburner.com';

$request = <<<EOT
<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
 <param>
  <value>
   <string>$weblog_name</string>
  </value>
 </param>
 <param>
  <value>
   <string>$weblog_url</string>
  </value>
 </param>
</params>
</methodCall>
EOT;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $ping_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_POSTFIELDS, trim($request)); 
$result = curl_exec($ch);
curl_close($ch); 

Второй метод: file_get_contents

file_get_contents("http://feedburner.google.com/fb/a/pingSubmit?bloglink=http://feeds.feedburner.com/myblog");

У меня вопрос, какое решение лучше и быстрее пропинговать как минимум 50 каналов одновременно?

Ответы [ 6 ]

12 голосов
/ 05 октября 2011

Получение google.com с использованием file_get_contents заняло (в секундах):

2.31319094
2.30374217
2.21512604
3.30553889
2.30124092

CURL заняло:

0.68719101
0.64675593
0.64326
0.81983113
0.63956594

При этом использовался тестовый класс из http://davidwalsh.name/php-timer-benchmark

3 голосов
/ 03 октября 2011

Поскольку вы будете обновлять 50 каналов одновременно , я настоятельно рекомендую использовать CURL по двум причинам:

  1. вы можете использовать функции curl_multi (), которые будутпозволяют отправлять все 50 запросов одновременно, в то время как file_get_contents () будет отправляться только один за другим.Документация по этим функциям немного скудна, поэтому я бы предложил использовать легковесную библиотеку - с ней намного проще работать.Я лично использую https://github.com/petewarden/ParallelCurl,, но вы найдете много вокруг.

  2. , так как вы пингуете службы, вам не нужно знать ответ, я думаю (до тех пор, покакак это HTTP 200).Таким образом, вы можете использовать опцию CURL CURLOPT_NOBODY, чтобы превратить его в запрос HEAD, таким образом, в ответ вы также получите только заголовки.Это должно еще больше ускорить процесс.

Иначе говоря, file_get_contents может быть быстрее для простых запросов, но в этом случае ваша ситуация непроста.Выполнение 50 запросов без необходимости возврата всего документа не является стандартным запросом.

2 голосов
/ 03 октября 2011

Если вам нужна гибкость в будущем (например, аутентификация, файлы cookie, прокси-сервер и т. Д.), Используйте cURL. Скорость примерно такая же, как у file_get_contents (), судя по тестам (некоторые говорят, что это быстрее)

Если вы хотите быстрое и простое решение, то обязательно используйте file_get_contents (). Однако он не был создан для запроса внешних URL-адресов. Большинство людей клянутся cURL за любую работу с внешними URL, даже простые запросы GET.

Единственная дополнительная работа с использованием cURL - это несколько дополнительных строк кода, заверните их в функцию, и все готово.

2 голосов
/ 03 октября 2011

Я бы порекомендовал рассмотреть возможность использования curl ... хотя на первый взгляд это может быть связано с некоторыми затратами на разработку, оно намного мощнее, чем file_get_contents.особенно, если вы хотите получить несколько каналов, стоит посмотреть несколько запросов curl:

http://php.net/manual/en/function.curl-multi-init.php

2 голосов
/ 03 октября 2011

На самом деле я думаю, что curl работает быстрее, чем file_get_contents.

Немного гугля, я обнаружил некоторые тесты здесь в SO: file_get_contents VS CURL, что имеет лучшую производительность?

1 голос
/ 21 сентября 2011

get_file_contents быстрее.Это делает простой http без каких-либо дополнительных экземпляров

...