2010-08-15 15 views
7

Utilizando el código debajo de cada imagen descarga) file_get_contents()) tarda una media de 8-15 segundos .....file_get_contents() con el contexto para utilizar HTTP/1.1 significativamente lenta velocidad de descarga

Si yo no uso un contexto en file_get_contents() luego la descarga de la imagen es menos de un segundo.

Si cambio los $ opts a, a continuación, obtengo el mismo rendimiento que file_get_contents() sin un contexto que toma appox 13 segundos para procesar 2.500 imágenesx.

$opts = array(
    'http'=>array(
     'protocol_version'=>'1.1', 
     'method'=>'GET', 
     'header'=>array(
      'Connection: close' 
     ), 
     'user_agent'=>'Image Resizer' 
    ) 
); 

Reproducir:

$start_time = mktime(); 
$products = array(
     array('code'=>'A123', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png'), 
     array('code'=>'A124', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png'), 
     array('code'=>'A125', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png'), 
     array('code'=>'A126', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png'), 
     array('code'=>'A127', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png'), 
     array('code'=>'A128', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png'), 
     array('code'=>'A134', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png'), 
     array('code'=>'A135', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png'), 
     array('code'=>'A146', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png'), 
     array('code'=>'A165', 'image_url'=>'http://www.google.com/intl/en_ALL/images/srpr/logo1w.png') 
    ); 

    if (count($products) > 0) { 
     $opts = array(
      'http'=>array(
       'protocol_version'=>'1.1', 
       'method'=>'GET', 
       'user_agent'=>'Image Resizer' 
      ) 
     ); 
     $context = stream_context_create($opts); 
     $def_width = 100; 
     $max_width = $def_width; 
     foreach($products as $product) { 
      $code = $product['code']; 
      $folder = substr($code, 0, 3); 
      echo('Looking at: ' .$product['code'] ."<br />"); 
      $file = '/tmp/' .$folder .'/' .$code .'_' .$def_width .'.jpg'; 
      $filemtime = @filemtime($file); 
      $gen_file = true; 
      if ($filemtime !== false) { 
       $file_age = (time() - $filemtime); 
       if ($file_age <= 300) { 
        $gen_file = false; 
       } 
      } 
      echo('&nbsp;&nbsp;&nbsp;&nbsp;File not cached or cached file has expired<br />'); 
      if ($gen_file) { 
       echo('&nbsp;&nbsp;&nbsp;&nbsp;Getting File...'); 
       $imgStr = file_get_contents($product['image_url'], false, $context); 
       $img = @imagecreatefromstring($imgStr); 
       if (is_resource($img)) { 
        echo('DONE' .'<br />'); 
        $image_x = imagesx($img); 
        $image_y = imagesy($img); 
        if ($def_width >= $image_x) { 
         $def_width = $image_x; 
        } 
        echo('&nbsp;&nbsp;&nbsp;&nbsp;Calculating Scale<br />'); 
        $ts = min($max_width/$image_x,$max_width/$image_y); 
        $thumbhght = $ts * $image_y; 
        $thumbwth = $ts * $image_x; 

        $thumb_image_resized = imagecreatetruecolor($thumbwth, $thumbhght); 
        imagecopyresampled($thumb_image_resized, $img, 0, 0, 0, 0, $thumbwth, $thumbhght, $image_x, $image_y); 
        echo('&nbsp;&nbsp;&nbsp;&nbsp;Checking For Directory<br />'); 
        if (!is_dir('/tmp/' .$folder)) { 
         mkdir('/tmp/' .$folder); 
        } 
        echo('&nbsp;&nbsp;&nbsp;&nbsp;Writing File<br />'); 
        $new_file = '/tmp/' .$folder .'/' .$code .'_' .$def_width .'.jpg'; 

        imagejpeg($thumb_image_resized, $new_file, 100); 
        echo('&nbsp;&nbsp;&nbsp;&nbsp;DONE<br />'); 

        imagedestroy($img); 
        imagedestroy($thumb_image_resized); 
       } else { 
        echo('Problem Getting Image<br />'); 
        die(); 
       } 
      } else { 
       echo('&nbsp;&nbsp;&nbsp;&nbsp;Already Exists<br />'); 
      } 
     } 
    } 
    $end_time = mktime(); 
    echo('Completed In...' .($end_time - $start_time) .' seconds(s)<br />'); 

Respuesta

9

Las solicitudes de HTTP 1.1 se canalizan de manera predeterminada. Si no "Connection: Close", asume "Connection: Keep-Alive", y luego tiene que esperar a que expire el tiempo de espera (ya que nunca lo cerró explícitamente) antes de que comience el siguiente ciclo.

+0

¡Gracias! Las solicitudes que tomaban 0.15s en HTTP 1.0 tomaban al menos 5s en HTTP 1.1. Un simple 'encabezado (" Conexión: cerrar "); ¡arreglado! – Mave

0

su contexto dice file_get_contents() para cerrar la conexión HTTP cada vez. Quizás es por eso que el código lleva tanto tiempo, ya que se cierra y vuelve a abrir conexiones muchas veces? No estoy familiarizado con las partes internas de file_get_contents(), pero podría modificar el contexto para usar "Connection: keep-alive" para todas las conexiones menos la última, y ​​"Connection: close" para la última.

+1

Esperaría que 'file_get_contents()' cerrara su conexión independientemente: cierra los identificadores de archivos cuando lee archivos del disco. Si quieres rendimiento, cURL es una mejor apuesta. Simplemente puede reutilizar el mismo identificador de curl una y otra vez; la conexión se mantiene abierta por defecto, si recuerdo correctamente. –

+0

Estoy de acuerdo con usted sobre el uso de cURL, a menos que haya una razón por la que dorgan tenga que usar file_get_contents(). –

Cuestiones relacionadas