sábado, 17 de mayo de 2008

En una de mis ideas marcianas que tengo me dio por hacer un script que transfiriera archivos MP3 de otros servidores, realizando la busqueda con Google a traves de sus busquedas avanzadas. Entre los problemas que consegui es que los ficheros se almacenaban en memoria y su size en bytes se duplica, y en caso de que sea mayor que el size destinado para los scripts en php (php.ini->memory_limit) ya saben tira un error como este donde nos avisa que nuestro script ocupa demasiada memoria.

En primer instancia buscaba verificar el size del archivo a descargar, pero no podia hacerlo que de todas maneras se saldria del limite (peleando contra la memoria), entonces lo que hice fue que a traves de sockets descargaba solamente la propiedad MIME de Content-Length: y verificar que fuese menor a la memoria que yo tenia disponible. Despues todo fue mas sencillo con cURL.


if(ereg("mp3",$img_url))
{
$img_url2= $url;
$img_url2.= $img_url; //<========== CHECAR LA DIAGONAL EN LA URL
if(get_remote_file_size($img_url2)<=12 && test_audio($img_url2)==true){
if (defined("CURLOPT_TIMEVALUE")){

$enlace = curl_init($img_url2);
curl_setopt($enlace, CURLOPT_VERBOSE, TRUE);
curl_setopt($enlace, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($enlace, CURLOPT_HEADER, FALSE);
curl_setopt($enlace, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($enlace, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($enlace, CURLOPT_USERAGENT, "HELLS-search/1.0.5");
set_error_handler("bandwitch_error_handler");
try {
$total_data = curl_exec($enlace);
} catch (Exception $e) {
echo $e->getMessage()."(".$img_url." / Failed)";
}
restore_error_handler();

curl_close($enlace);
}

$file_full = "./".$date."/".$img_url; //<====== CHECAR PATH
$fp = fopen($file_full,"w");

fwrite($fp,$total_data);

echo $img_url.' - Descargado -Memoria usada: ' . round(memory_get_usage() / 1024,1) . ' KB de ' . round(memory_get_usage(1) / 1024,1) . ' KB <br>';


}
flush();
unset($total_data);
unset($fp);
unset($item);
unset($img_url);
unset($enlace);
}

0 comentarios :