2011-09-21 8 views
5

Sto gestendo un sito di feed reader, dove ci sarà un sacco di RSS in giro. Dovrò sincronizzare tali feed il più spesso possibile, quindi ho trovato questi due metodi per farlo.CURL o file_get_contents per aggiornare un elenco di feed?

1 Metodo: Usando 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); 

Secondo metodo: file_get_contents

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

La mia domanda è: quale è la soluzione migliore e più veloce per eseguire il ping almeno 50 i feed in una sola volta?

risposta

12

Recuperare google.com utilizzando file_get_contents preso (in secondi):

2.31319094 
2.30374217 
2.21512604 
3.30553889 
2.30124092 

CURL preso:

0.68719101 
0.64675593 
0.64326 
0.81983113 
0.63956594 

Questo stava usando la classe di riferimento da http://davidwalsh.name/php-timer-benchmark

1

get_file_contents è più veloce. Fa un semplice http senza ulteriori istanze

+0

non ho familiarità con Curl , ottiene i contenuti? Voglio dire come funziona? Inoltre, 50 get_file_contents sarà molto lento? – EnexoOnoma

+1

cURL otterrà anche le intestazioni per la richiesta http. È possibile aggiungere intestazioni delle proprie richieste, variabili post e server proxy in cURL. Tuttavia, per una semplice richiesta get, cURL non è necessario. Trovo che cURL impieghi 10 ms più a lungo sul mio server di wamp apache2.2.17 php5.3.5 per http://www.google.com –

+0

@mtopia in realtà non fa differenza perché get_file_contents è sincrono, cioè viene eseguita la riga successiva solo dopo che questa linea è stata completamente eseguita –

2

Vorrei raccomandare considerare l'uso di riccio ... mentre potrebbe essere un certo overhead di sviluppo a prima vista, è molto più potente di file_get_contents . soprattutto se si vuole andare a prendere più feed, multi richieste ricciolo potrebbe valere la pena guardare:

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

2

Se si vuole flessibilità per il futuro (ad esempio l'autenticazione, cookie, proxy, ecc), quindi utilizzare cURL. La velocità è la stessa di file_get_contents() a giudicare dai benchmark (alcuni dicono che è più veloce)

Se si desidera una soluzione rapida e semplice, utilizzare in ogni caso file_get_contents(). Tuttavia, non è stato creato allo scopo di richiedere URL esterni. La maggior parte delle persone giura su cURL per aver lavorato con URL esterni, anche con semplici richieste GET.

L'unico lavoro aggiuntivo con l'utilizzo di cURL è alcune righe di codice in più, avvolgetelo in una funzione e siete a posto.

3

Siccome verranno aggiornando 50 alimenta subito, vi consiglierei vivamente usando CURL per due motivi:

  1. è possibile utilizzare curl_multi() funzioni che vi permetteranno di inviare tutte le 50 richieste contemporaneamente, mentre file_get_contents() andrà solo uno alla volta. La documentazione di queste funzioni è un po 'sparsa, quindi suggerirei di utilizzare una libreria leggera: è molto più semplice lavorare con . Io personalmente uso https://github.com/petewarden/ParallelCurl, ma troverete molti in giro.

  2. come si sta eseguendo il ping dei servizi, non è proprio necessario conoscere la risposta (a patto che sia HTTP 200). Quindi potresti utilizzare l'opzione CURL CURLOPT_NOBODY per fare in una richiesta HEAD, in risposta otterresti solo le intestazioni. Questo dovrebbe velocità fino al processo ancora di più.

In caso contrario, file_get_contents potrebbe essere più veloce per le richieste semplici, ma in questo caso la situazione non è semplice. Sparare 50 richieste senza veramente bisogno di recuperare l'intero documento non è una richiesta standard.