Scarica più immagini dal server remoto con PHP (MOLTE immagini)

Sto cercando di scaricare molti file da un server esterno (circa 3700 immagini). Queste immagini vanno da 30KB a 200KB ciascuna.

Quando uso la function copy() su 1 image, funziona. Quando lo uso in un ciclo, tutto ciò che ottengo sono immagini da 30B (file di immagini vuote).

Ho provato a utilizzare copy , cURL , wget e file_get_contents . Ogni volta, ottengo un sacco di file vuoti o niente del tutto.

Ecco i codici che ho provato:

wget:

 exec('wget http://mediaserver.centris.ca/media.ashx?id=ADD4B9DD110633DDDB2C5A2D10&t=pi&f=I -O SIA/8605283.jpg'); 

copia:

 if(copy($donnees['PhotoURL'], $filetocheck)) { echo 'Photo '.$filetocheck.' updated<br/>'; } 

arricciare:

 $ch = curl_init(); $source = $data[PhotoURL]; curl_setopt($ch, CURLOPT_URL, $source); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec ($ch); curl_close ($ch); $destination = $newfile; $file = fopen($destination, "w+"); fputs($file, $data); fclose($file); 

Niente sembra funzionare correttamente. Sfortunatamente, non ho molta scelta per scaricare tutti questi file contemporaneamente, e ho bisogno di un modo per farlo funzionare il prima ansible.

Grazie mille, Antoine

Ho usato questa function per questo e ho funzionato abbastanza bene.

 function saveImage($urlImage, $title){ $fullpath = '../destination/'.$title; $ch = curl_init ($urlImage); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); $rawdata=curl_exec($ch); curl_close ($ch); if(file_exists($fullpath)){ unlink($fullpath); } $fp = fopen($fullpath,'x'); $r = fwrite($fp, $rawdata); setMemoryLimit($fullpath); fclose($fp); return $r; } 

Combinato con questo altro per evitare l'overflow della memory:

 function setMemoryLimit($filename){ set_time_limit(50); $maxMemoryUsage = 258; $width = 0; $height = 0; $size = ini_get('memory_limit'); list($width, $height) = getimagesize($filename); $size = $size + floor(($width * $height * 4 * 1.5 + 1048576) / 1048576); if ($size > $maxMemoryUsage) $size = $maxMemoryUsage; ini_set('memory_limit',$size.'M'); } 

Ottenere loro uno per uno potrebbe essere piuttosto lento. Prendi in considerazione di suddividerli in pacchetti di 20-50 immagini e di afferrarli con più thread. Ecco il codice per iniziare:

 $chs = arrays(); $cmh = curl_multi_init(); for ($t = 0; $t < $tc; $t++) { $chs[$t] = curl_init(); curl_setopt($chs[$t], CURLOPT_URL, $targets[$t]); curl_setopt($chs[$t], CURLOPT_RETURNTRANSFER, 1); curl_multi_add_handle($cmh, $chs[$t]); } $running=null; do { curl_multi_exec($cmh, $running); } while ($running > 0); for ($t = 0; $t < $tc; $t++) { $path_to_file = 'your logic for file path'; file_put_contents($path_to_file, curl_multi_getcontent($chs[$t])); curl_multi_remove_handle($cmh, $chs[$t]); curl_close($chs[$t]); } curl_multi_close($cmh); 

Ho usato questo approccio per catturare alcuni milioni di immagini di recente, dato che uno per uno avrebbe richiesto fino a un mese.

La quantità di immagini che acquisisci in una volta dovrebbe dipendere dalla loro dimensione prevista e dai limiti di memory.