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

PHPz
Libérer: 2021-05-28 18:06:33
avant
3947 Les gens l'ont consulté

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}";
?>
Copier après la connexion

. 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}";
?>
Copier après la connexion

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"

Étiquettes associées:
source:jb51.net
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal