Maison  >  Article  >  développement back-end  >  Comparaison des performances PHP fopen/file_get_contents et curl

Comparaison des performances PHP fopen/file_get_contents et curl

藏色散人
藏色散人avant
2019-07-10 14:16:203787parcourir

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

1 fopen/file_get_contents refaire 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 utilise http_fopen_wrapper lors de la demande HTTP et ne restera pas en ligne.

Mais curl oui. De cette façon, curl sera plus efficace lors de la demande répétée de plusieurs liens.

3. La fonction 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, la fonction sera invalide. 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.

Lorsque file_get_contents récupère le fichier distant, les résultats seront stockés dans une chaîne. La fonction fiels le stockera sous forme de tableau

Par conséquent, je préfère toujours utiliser curl pour accéder à la télécommande. URL. 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

#最近需要获取别人网站上的音乐数据。用了file_get_contents函数,但是总是会遇到获取失败的问题,尽管按照手册中的 例子设置了超时,可多数时候不会奏效:
$config['context'] = stream_context_create(array(‘http’ => array(‘method’ => “GET”,
   ’timeout’ => 5//这个超时时间不稳定,经常不奏效
   )
  ));
#这时候,看一下服务器的连接池,会发现一堆类似的错误,让我头疼万分:
file_get_contents(http://***): failed to open stream…
#现在改用了curl库,写了一个函数替换:
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;
}

De cette façon, à l'exception de vrais problèmes de réseau, aucun problème n'est survenu .

Il s'agit d'un test effectué par d'autres à propos de curl et file_get_contents :

file_get_contents Le nombre de secondes nécessaires pour explorer google.com :

2.31319094
2.30374217
2.21512604
3.30553889
2.30124092

Temps utilisé par curl :

0.68719101
0.64675593
0.64326
0.81983113
0.63956594

Y a-t-il un grand écart ?

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. Non seulement elle est stable et rapide, mais elle peut également simuler le navigateur pour usurper 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. regardez le tableau des résultats suivant :

La comparaison des performances de curl avec le code source PHP file_get_contents est la suivante :

<?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"; 
?>

vitesse de 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 est que la charge du serveur est inférieure.

Résumé

Lorsque file_get_contents est traité fréquemment et petit , ça 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 d'être mis à niveau. 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.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer