Heim  >  Artikel  >  Backend-Entwicklung  >  Vergleichende Analyse der Leistung von file_get_contents und Curl in PHP

Vergleichende Analyse der Leistung von file_get_contents und Curl in PHP

不言
不言Original
2018-06-06 11:13:132321Durchsuche

Dieser Artikel stellt hauptsächlich den Leistungsvergleich zwischen file_get_contents und Curl in PHP vor und analysiert den Unterschied zwischen file_get_contents und Curl im Detail sowie den Vergleich der Betriebseffizienz in Form von Beispielen

Die Beispiele in diesem Artikel beschreiben eine vergleichende Analyse der Leistung von file_get_contents und Curl in PHP. Teilen Sie es als Referenz mit allen. Die Details sind wie folgt:

Wenn Sie die Leistung in PHP nicht sorgfältig analysieren, werden Sie feststellen, dass file_get_contents und Curl viele Gemeinsamkeiten haben. Sie können sowohl Dateien sammeln als auch Dateien öffnen, aber wenn Sie vergleichen Wenn Sie sie sorgfältig betrachten, werden Sie viele Unterschiede feststellen. Schauen wir uns den Unterschied zwischen file_get_contents und curl an.

Der Unterschied zwischen den Funktionen fopen, file_get_contents und curl in PHP:

1. fopen /file_get_contents führt die DNS-Abfrage für jede Anfrage erneut durch und speichert sie nicht im Cache die DNS-Informationen. Aber CURL speichert DNS-Informationen automatisch zwischen. Anfragen nach Webseiten oder Bildern unter demselben Domainnamen erfordern nur eine DNS-Abfrage. Dadurch wird die Anzahl der DNS-Anfragen erheblich reduziert. Daher ist die Leistung von CURL viel besser als die von fopen /file_get_contents.

2.fopen /file_get_contents Beim Anfordern von HTTP wird http_fopen_wrapper verwendet und wird nicht live gehalten. Aber Curl kann. Auf diese Weise ist Curl effizienter, wenn mehrere Links mehrmals angefordert werden.

3.fopen / file_get_contents-Funktion wird von der Konfiguration der Option „allow_url_open“ in der Datei php.ini beeinflusst. Wenn die Konfiguration ausgeschaltet ist, wird diese Funktion deaktiviert. Curl ist von dieser Konfiguration nicht betroffen.

4.curl kann eine Vielzahl von Anfragen simulieren, z. B. POST-Daten, Formularübermittlung usw. Benutzer können Anfragen entsprechend ihren eigenen Bedürfnissen anpassen. Und fopen/file_get_contents kann nur die get-Methode zum Abrufen von Daten verwenden.
file_get_contents speichert die Ergebnisse in einer Zeichenfolge, wenn Remote-Dateien abgerufen werden, während die Funktion „fields“ sie in Array-Form speichert.

Daher verwende ich immer noch lieber Curl, um auf die Remote-URL zuzugreifen. PHP verfügt über eine Curl-Modulerweiterung, die sehr leistungsfähig ist.

Nach langem Gespräch kann jeder sagen, dass es keinen Leistungsvergleich gibt, also werfen wir einen Blick darauf

In letzter Zeit müssen wir Musikdaten von den Websites anderer Leute beziehen. Ich habe die Funktion „file_get_contents“ verwendet, bin aber immer auf das Problem gestoßen, dass ich sie nicht abrufen konnte. Obwohl ich das Timeout gemäß den Beispielen im Handbuch eingestellt habe, hat es meistens nicht funktioniert:

Code kopieren Der Code lautet wie folgt:

$config['context'] = stream_context_create(array('http' => array('method' => "GET",
   'timeout' => 5//这个超时时间不稳定,经常不奏效
   )
));

Wenn ich mir zu diesem Zeitpunkt den Verbindungspool des Servers ansehe, werde ich eine Reihe ähnlicher Fehler finden, die mir Kopfschmerzen bereiten:

file_get_contents(http://***): Stream konnte nicht geöffnet werden...
Jetzt verwende ich die Curl-Bibliothek und schreibe einen Funktionsersatz:

Kopieren Sie den CodeDer Code lautet wie folgt:

function curl_file_get_contents($durl){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $durl);
  curl_setopt($ch, CURLOPT_TIMEOUT, 5);
  curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
  curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $r = curl_exec($ch);
  curl_close($ch);
   return $r;
}

So, keine weiteren Probleme außer echten Netzwerkproblemen.
Dies ist ein von anderen durchgeführter Test zu Curl und file_get_contents:
Die Anzahl der Sekunden, die file_get_contents benötigt, um google.com zu crawlen:
2.31319094
2.30374217
2.21512604
3.30553889
2,30124 092
Von Curl verbrauchte Zeit:
0,68719101
0,64675593
0,64326
0,81983113
0,63956594

Gibt es einen großen Unterschied? Haha, meiner Erfahrung nach unterscheiden sich diese beiden Tools nicht nur in der Geschwindigkeit, sondern auch in der Stabilität.

Freunden, die hohe Anforderungen an die Stabilität der Netzwerkdatenerfassung haben, wird empfohlen, die obige Funktion „curl_file_get_contents“ zu verwenden. Sie ist nicht nur stabil und schnell, sondern kann auch den Browser fälschen, um die Zieladresse zu täuschen

Schauen Sie sich ein anderes Beispiel an

Die Vergleichsergebnisse von curl und file_get_contents wurden später veröffentlicht. Zusätzlich zum Leistungsvergleich von curl und file_get_contents wird auch deren Leistungsvergleich berücksichtigt Schauen Sie sich das folgende Ergebnisdiagramm an:

Der Leistungsvergleich zwischen dem PHP-Quellcode von curl und file_get_contents lautet wie folgt:

Code kopieren Der Code lautet wie folgt:

<?php 
/** 
 
* 通过淘宝IP接口获取IP地理位置 
 
* @param string $ip 
 
* @return: string 
 
**/
function getCityCurl($ip) 
{ 
    $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip; 
    $ch = curl_init(); 
    $timeout = 5; 
    curl_setopt ($ch, CURLOPT_URL, $url); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    $file_contents = curl_exec($ch); 
    curl_close($ch); 
  
    $ipinfo=json_decode($file_contents); 
    if($ipinfo->code==&#39;1&#39;){ 
        return false; 
    } 
    $city = $ipinfo->data->region.$ipinfo->data->city; 
    return $city; 
} 
  
function getCity($ip) 
{ 
    $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip; 
    $ipinfo=json_decode(file_get_contents($url)); 
    if($ipinfo->code==&#39;1&#39;){ 
        return false; 
    } 
    $city = $ipinfo->data->region.$ipinfo->data->city; 
    return $city; 
} 
  
// for file_get_contents 
$startTime=explode(&#39; &#39;,microtime()); 
$startTime=$startTime[0] + $startTime[1]; 
for($i=1;$i<=10;$i++) 
{ 
   echo getCity("121.207.247.202")."</br>"; 
} 
$endTime = explode(&#39; &#39;,microtime()); 
$endTime = $endTime[0] + $endTime[1]; 
$totalTime = $endTime - $startTime; 
echo &#39;file_get_contents:&#39;.number_format($totalTime, 10, &#39;.&#39;, "")." seconds</br>"; 
  
//for curl 
$startTime2=explode(&#39; &#39;,microtime()); 
$startTime2=$startTime2[0] + $startTime2[1]; 
for($i=1;$i<=10;$i++) 
{ 
   echo getCityCurl(&#39;121.207.247.202&#39;)."</br>"; 
} 
$endTime2 = explode(&#39; &#39;,microtime()); 
$endTime2=$endTime2[0] + $endTime2[1]; 
$totalTime2 = $endTime2 - $startTime2; 
echo "curl:".number_format($totalTime2, 10, &#39;.&#39;, "")." seconds"; 
?>

Testzugriff
file_get_contents-Geschwindigkeit: 4,2404510975 Sekunden
Curl-Geschwindigkeit: 2,8205530643 Sekunden
Curl ist etwa 30 % schneller als file_get_contents ist, dass die Serverlast geringer ist.

Zusammenfassung

Wenn die Verarbeitung von file_get_contents häufig und klein ist, fühlt es sich gut an, sie zu verwenden. Nichts Ungewöhnliches. Wenn Ihre Datei von mehr als 1.000 Personen bearbeitet wird. Dann wartet Ihre Server-CPU auf einen Boost. Daher schlage ich vor, dass ich und jeder in Zukunft beim Schreiben von PHP-Code die Curl-Bibliothek verwenden.

Verwandte Empfehlungen:

So implementieren Sie Controller-übergreifende Aufrufe an andere Module in thinkphp3.2

Das obige ist der detaillierte Inhalt vonVergleichende Analyse der Leistung von file_get_contents und Curl in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn