PHP: Curl Handles schneller erzeugen durch Kopieren

Die cURL Bibliothek wir gern benutzt um Transfers in Netzwerken zu machen. Auch PHP hat ein cURL Modul welches viele Funktionen von cURL bietet. Um cURL zu nutzen muss dazu erst ein cURL Handle erzeugt werden, dem dann Optionen übergeben werden welche den Transfer beeinflussen.
Wer viele dieser Handles erstellen muss wäre nach meinem Benchmark schneller wenn er sich einen cURL Template Handle erstellt und diesen dann nur noch mit curl_copy_handle() kopiert und fehlende Optionen hinzufügt. Auf diese Weise kann man einen cURL Handle etwa 40% schneller erschaffen als es jedes mal komplett neu möglich ist.

Wer den Benchmark sehen will, einfach weiterlesen.

Das Script:

<?php

// Settings
$n = 100000;
$url = 'http://www.google.com/';

/**
 * Returns a simple curl handle with some settings
 * @return handle curl handle
 */

function curl_create_handle($url='') {
  $ch = curl_init();
  if($url)
    curl_setopt($ch, CURLOPT_URL,            $url);
  curl_setopt($ch, CURLOPT_HEADER,         false);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_TIMEOUT,        10);
  curl_setopt($ch, CURLOPT_USERAGENT,      'Curl test Script');
  return $ch;
}

//Benchmark

// Creating $n times a NEW curl handle
$time_start = microtime(true);
$i = 0;
while($i < $n) {
    $ch = curl_create_handle($url);
    if(!$ch) echo "ERROR: Invalid NEW curl handle! \n";
    curl_close($ch);
    ++$i;
}
$time_end = microtime(true);
$time_curl_new = $time_end-$time_start;
echo number_format($time_curl_new, 3, '.', '')
  ." seconds - for $n NEW curl handles \n";
 
 
// Creating $n times a COPY of a curl handle
$ch_template = curl_create_handle();
$time_start = microtime(true);
$i = 0;
while($i < $n) {
    $ch = curl_copy_handle($ch_template);
    curl_setopt($ch, CURLOPT_URL, $url);
    if(!$ch) echo "ERROR: Invalid COPY curl handle! \n";
    curl_close($ch);
    ++$i;
}
$time_end = microtime(true);
$time_curl_copy = $time_end-$time_start;
echo number_format($time_curl_copy, 3, '.', '')
  ." seconds - for $n COPYs of curl handles \n";

// Output conclusion
echo "\nA copy of a curl handle is "
  .number_format((1-($time_curl_copy/$time_curl_new))*100, 2, '.', '')
  ."% faster than a new one.\n";

?>

Ergebnis des Scripts:

1.543 seconds - for 100000 NEW curl handles
0.901 seconds - for 100000 COPYs of curl handles

A copy of a curl handle is 41.65% faster than a new one.

Da die cURL Bibliothek in früheren PHP Versionen nicht fehlerfrei umgesetzt wurde, habe ich noch den Check "if(!$ch) echo "ERROR: Invalid COPY curl handle! \n";" eingebaut welcher Hinweise darauf gibt wenn etwas schief gelaufen ist.

Man kann die curl_copy_handle() Funktion auch gut dazu nutzen um ein cURL Handle Template mit fertigen Voreinstellungen zu verwenden um nicht jedes mal die Optionen neu setzten zu müssen. Dies gibt einem auch eine gewisse Sicherheit nicht eine Option zu vergessen. Wenn dies dann auch noch schneller ist macht man das doch gerne.

Related posts:


 
 
 

Die Kommentarfunktion zu diesem Beitrag wurde deaktiviert.