Maison  >  Article  >  développement back-end  >  Analyse de la façon dont PHP utilise la concurrence curl pour réduire le temps d'accès au backend

Analyse de la façon dont PHP utilise la concurrence curl pour réduire le temps d'accès au backend

PHPz
PHPzavant
2016-05-16 08:59:513896parcourir

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.

Analyse de la façon dont PHP utilise la concurrence curl pour réduire le temps d'accès au backend

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])) == &#39;&#39;) {
      $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"

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer