Cet article vous présentera comment PHP utilise la concurrence curl pour réduire le temps d'accès au back-end. Il utilise également des exemples pour comparer et analyser le temps d'exécution du programme avant et après que curl utilise l'accès simultané. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
Dans nos programmes quotidiens, il est inévitable d'accéder à plusieurs interfaces en même temps Lorsque nous utilisons habituellement curl pour accéder, il s'agit généralement d'un accès unique et séquentiel. il y a 3 interfaces, chaque interface prend 500 millisecondes, donc nos trois interfaces prendront 1500 millisecondes. Ce problème est trop compliqué et affecte sérieusement la vitesse d'accès aux pages. Est-il possible d'augmenter la vitesse par accès simultané ? Aujourd'hui, je vais parler brièvement de l'utilisation de la concurrence curl pour améliorer la vitesse d'accès aux pages,
1. Ancienne méthode d'accès curl et statistiques chronophages
<?php function curl_fetch($url, $timeout=3){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); $errno = curl_errno($ch); if ($errno>0) { $data = false; } curl_close($ch); return $data; } function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $url_arr=array( "taobao"=>"http://www.taobao.com", "sohu"=>"http://www.sohu.com", "sina"=>"http://www.sina.com.cn", ); $time_start = microtime_float(); $data=array(); foreach ($url_arr as $key=>$val) { $data[$key]=curl_fetch($val); } $time_end = microtime_float(); $time = $time_end - $time_start; echo "耗时:{$time}"; ?>
. Prend du temps : 0,614 secondes
2. Méthodes d'accès simultanées Curl et statistiques chronophages
<?php function curl_multi_fetch($urlarr=array()){ $result=$res=$ch=array(); $nch = 0; $mh = curl_multi_init(); foreach ($urlarr as $nk => $url) { $timeout=2; $ch[$nch] = curl_init(); curl_setopt_array($ch[$nch], array( CURLOPT_URL => $url, CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => $timeout, )); curl_multi_add_handle($mh, $ch[$nch]); ++$nch; } /* wait for performing request */ do { $mrc = curl_multi_exec($mh, $running); } while (CURLM_CALL_MULTI_PERFORM == $mrc); while ($running && $mrc == CURLM_OK) { // wait for network if (curl_multi_select($mh, 0.5) > -1) { // pull in new data; do { $mrc = curl_multi_exec($mh, $running); } while (CURLM_CALL_MULTI_PERFORM == $mrc); } } if ($mrc != CURLM_OK) { error_log("CURL Data Error"); } /* get data */ $nch = 0; foreach ($urlarr as $moudle=>$node) { if (($err = curl_error($ch[$nch])) == '') { $res[$nch]=curl_multi_getcontent($ch[$nch]); $result[$moudle]=$res[$nch]; } else { error_log("curl error"); } curl_multi_remove_handle($mh,$ch[$nch]); curl_close($ch[$nch]); ++$nch; } curl_multi_close($mh); return $result; } $url_arr=array( "taobao"=>"http://www.taobao.com", "sohu"=>"http://www.sohu.com", "sina"=>"http://www.sina.com.cn", ); function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $time_start = microtime_float(); $data=curl_multi_fetch($url_arr); $time_end = microtime_float(); $time = $time_end - $time_start; echo "耗时:{$time}"; ?>
Prend du temps : 0,316 secondes
Le temps d'accès à l'interface back-end pour la page entière de Handsome Bar est réduit de moitié
3 paramètres liés aux boucles
curl_close. — Ferme une session cURL
curl_copy_handle — Copie un handle cURL avec toutes ses préférences
curl_errno — Renvoie le dernier numéro d'erreur
curl_error — Renvoie une chaîne contenant la dernière erreur de la session en cours
curl_exec — Effectuer une session cURL
curl_getinfo — Obtenir des informations concernant un transfert spécifique
curl_init — Initialiser une session cURL
curl_multi_add_handle — Ajouter un handle cURL normal à un multi handle cURL
curl_multi_close — Fermer un ensemble de cURL handles
curl_multi_exec — Exécute les sous-connexions du handle cURL actuel
curl_multi_getcontent — Renvoie le contenu d'un handle cURL si CURLOPT_RETURNTRANSFER est défini
curl_multi_info_read — Obtenez des informations sur les transferts en cours
curl_multi_init — Renvoie un nouveau cURL multi handle
curl_multi_remove_handle — Supprimer un multi handle d'un ensemble de cURL handles
curl_multi_select — Attendre l'activité sur n'importe quelle connexion curl_multi
curl_setopt_array — Définir plusieurs options pour un transfert cURL
curl_setopt — Définir un option pour un transfert cURL
curl_version — Obtient les informations sur la version cURL
J'espère que cet article sera utile à tout le monde dans la programmation PHP.
Apprentissage recommandé : "Tutoriel vidéo PHP"