Maison >développement back-end >tutoriel php >Analyse comparative des performances file_get_contents et curl en php
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
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
.
Regardez un autre exempleLes 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=='1'){ 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=='1'){ return false; } $city = $ipinfo->data->region.$ipinfo->data->city; return $city; } // for file_get_contents $startTime=explode(' ',microtime()); $startTime=$startTime[0] + $startTime[1]; for($i=1;$i<=10;$i++) { echo getCity("121.207.247.202")."</br>"; } $endTime = explode(' ',microtime()); $endTime = $endTime[0] + $endTime[1]; $totalTime = $endTime - $startTime; echo 'file_get_contents:'.number_format($totalTime, 10, '.', "")." seconds</br>"; //for curl $startTime2=explode(' ',microtime()); $startTime2=$startTime2[0] + $startTime2[1]; for($i=1;$i<=10;$i++) { echo getCityCurl('121.207.247.202')."</br>"; } $endTime2 = explode(' ',microtime()); $endTime2=$endTime2[0] + $endTime2[1]; $totalTime2 = $endTime2 - $startTime2; echo "curl:".number_format($totalTime2, 10, '.', "")." 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!