file_get_contents() mit Kontext für die Verwendung von http/1.1 ist deutlich langsamer download-Geschwindigkeiten
Verwenden Sie den code, der unter jedem Bild laden) file_get_contents() ) dauert im Durchschnitt 8-15 Sekunden.....
Wenn ich nicht mit einem Kontext auf file_get_contents() und dann image-download ist weniger als eine Sekunde.
Wenn ich die $opts zu, unten dann bekomme ich die gleiche Leistung wie file_get_contents() ohne Kontext, die dauert ca 13 Sekunden zum verarbeiten von 2.500 imagesx.
$opts = array(
'http'=>array(
'protocol_version'=>'1.1',
'method'=>'GET',
'header'=>array(
'Connection: close'
),
'user_agent'=>'Image Resizer'
)
);
Reproduzieren:
$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( ' File not cached or cached file has expired<br />' );
if ( $gen_file ) {
echo( ' 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( ' 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( ' Checking For Directory<br />' );
if ( !is_dir( '/tmp/' .$folder ) ) {
mkdir( '/tmp/' .$folder );
}
echo( ' Writing File<br />' );
$new_file = '/tmp/' .$folder .'/' .$code .'_' .$def_width .'.jpg';
imagejpeg( $thumb_image_resized, $new_file, 100);
echo( ' DONE<br />' );
imagedestroy($img);
imagedestroy($thumb_image_resized);
} else {
echo( 'Problem Getting Image<br />' );
die();
}
} else {
echo( ' Already Exists<br />' );
}
}
}
$end_time = mktime();
echo( 'Completed In...' .($end_time - $start_time ) .' seconds(s)<br />' );
Du musst angemeldet sein, um einen Kommentar abzugeben.
HTTP 1.1 Anfragen sind per Pipelining standardmäßig. Wenn Sie nicht "Connection: Close", es meint "Connection: Keep-Alive", und dann müssen Sie warten, bis die Verbindung zum time-out (da Sie nie explizit geschlossen), bevor der nächste loop beginnt.
Ihrem Kontext erzählt, file_get_contents() zum schließen der HTTP-Verbindung jedes mal. Vielleicht ist das, warum der code so lange dauert, wie es sich schließt und wieder öffnet-verbindungen oft? Ich bin nicht vertraut mit den Interna von file_get_contents(), aber vielleicht sind Sie in der Lage zu zwicken Kontext verwenden "Connection: keep-alive" für alle, aber die Letzte Verbindung, und "Connection: close" für den letzten.
file_get_contents()
zu schließen, Verbindung egal-es schließt Datei-handles beim Lesen von Dateien von der Festplatte. Wenn Sie wollen Leistung, cURL ist eine bessere Wette. Sie können einfach die Wiederverwendung der gleichen curl Griff über und über; die Verbindung gehalten wird standardmäßig geöffnet, wenn ich mich Recht erinnere.