Maison  >  Article  >  développement back-end  >  Analyse comparative des performances file_get_contents et curl en php

Analyse comparative des performances file_get_contents et curl en php

不言
不言original
2018-06-06 11:13:132255parcourir

Cet article présente principalement la comparaison des performances entre file_get_contents et curl en PHP, et analyse en détail la différence entre file_get_contents et curl ainsi que la comparaison de l'efficacité opérationnelle sous forme d'exemples. Les amis dans le besoin peuvent s'y référer

Les exemples de cet article décrivent l'analyse comparative des performances file_get_contents et curl en PHP. Partagez-le avec tout le monde pour votre référence. Les détails sont les suivants :

Si vous n'analysez pas soigneusement les performances en PHP, vous constaterez que file_get_contents et curl ont beaucoup en commun. Ils peuvent à la fois collecter des fichiers et ouvrir des fichiers, mais si vous comparez. attentivement, vous trouverez de nombreuses différences, jetons un coup d'œil à la différence entre file_get_contents et curl.

La différence entre les fonctions fopen, file_get_contents et curl en PHP :

1 fopen /file_get_contents refait la requête DNS pour chaque requête et ne met pas en cache. les informations DNS. Mais CURL mettra automatiquement en cache les informations DNS. Les demandes de pages Web ou d'images sous le même nom de domaine ne nécessitent qu'une seule requête DNS. Cela réduit considérablement le nombre de requêtes DNS. Les performances de CURL sont donc bien meilleures que celles de fopen /file_get_contents.

2.fopen /file_get_contents Lors d'une demande HTTP, http_fopen_wrapper est utilisé et ne restera pas en ligne. Mais curl, c’est possible. De cette façon, curl sera plus efficace lors de la demande répétée de plusieurs liens.

La fonction 3.fopen / file_get_contents sera affectée par la configuration de l'option allow_url_open dans le fichier php.ini. Si la configuration est désactivée, cette fonction sera désactivée. Curl n'est pas affecté par cette configuration.

4.curl peut simuler une variété de requêtes, telles que les données POST, la soumission de formulaires, etc. Les utilisateurs peuvent personnaliser les requêtes en fonction de leurs propres besoins. Et fopen/file_get_contents ne peut utiliser que la méthode get pour obtenir des données.

file_get_contents stockera les résultats dans une chaîne lors de l'obtention de fichiers distants, tandis que la fonction fiels les stockera sous forme de tableau

Par conséquent, je préfère toujours utiliser curl pour accéder à l'URL distante. Php a une extension de module curl, qui est très puissante.

Après avoir longuement parlé, tout le monde peut dire qu'il n'y a pas de comparaison en termes de performances, alors jetons un coup d'oeil

Récemment, nous avons besoin d'obtenir des données musicales à partir de sites Web d'autres personnes. J'ai utilisé la fonction file_get_contents, mais j'ai toujours rencontré le problème de l'échec de son obtention. Même si j'ai défini le délai d'attente selon les exemples du manuel, cela n'a pas fonctionné la plupart du temps :


.

Copier le code Le code est le suivant :

$config['context'] = stream_context_create(array('http' => array('method' => "GET",
   'timeout' => 5//这个超时时间不稳定,经常不奏效
   )
));
En ce moment, si je regarde le pool de connexions du serveur, je trouverai un tas d'erreurs similaires, ce qui me donne mal à la tête :

file_get_contents(http://*** ) : échec d'ouverture du flux...

Maintenant, j'utilise la bibliothèque curl et j'ai écrit une fonction de remplacement :

Copiez le codeLe code est le suivant :

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;
}
Donc, plus de problèmes autres que de vrais problèmes de réseau.

Il s'agit d'un test effectué par d'autres à propos de curl et file_get_contents :
Le nombre de secondes nécessaires à file_get_contents pour explorer google.com :
2.31319094
2.30374217
2.21512604
3.30553889
2.30124 092
Temps utilisé par curl :
0.68719101
0.64675593
0.64326
0.81983113
0.63956594

Y a-t-il une grande différence ? Haha, d'après mon expérience, ces deux outils sont non seulement différents en vitesse, mais aussi en stabilité.

Il est recommandé aux amis qui ont des exigences élevées en matière de stabilité de la capture des données réseau d'utiliser la fonction curl_file_get_contents ci-dessus. Elle est non seulement stable et rapide, mais peut également simuler le navigateur pour tromper l'adresse cible

.

Regardez un autre exemple

Les résultats de la comparaison de curl et file_get_contents ont été publiés plus tard. En plus de la comparaison des performances de curl et file_get_contents, il inclut également leur comparaison de performances. Avant d'en parler, jetez un œil. dans le tableau de résultats suivant :

La comparaison des performances entre curl et le code source PHP file_get_contents est la suivante :


Copier le code Le code est le suivant :

<?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"; 
?>
Test d'accès

vitesse file_get_contents : 4,2404510975 secondes
vitesse de curl : 2,8205530643 secondes
curl est environ 30 % plus rapide que file_get_contents Le plus important. le problème, c'est que la charge du serveur est moindre.

Résumé

Lorsque le traitement file_get_contents est fréquent et petit, cela fait du bien de l'utiliser. Rien d'inhabituel. Si votre dossier est traité par plus de 1 000 personnes. Ensuite, le processeur de votre serveur attend un coup de pouce. Par conséquent, je recommande à moi et à tout le monde d'utiliser la bibliothèque curl lors de l'écriture de code PHP à l'avenir.

Recommandations associées :

Comment implémenter des appels entre contrôleurs vers d'autres modules dans thinkphp3.2

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn