Monthly Archives: febrero 2014

File_get_contents vs cURL

By | 25 febrero, 2014

Imagen ordenadores hostComo la mayoría de los “host” bloquean el uso de “ File_get_contents ” por motivos de seguridad, es necesario suplir su uso por otra función, “cURL”, en este caso, que nos va a permitir extraer el contenido de cierta web externa y utilizarlo en la nuestra propia a voluntad…

Mientras que “ File_get_contents ” es tan fácil de usar como:

File_get_contents

cURL” es bastante más compleja de usar, dando muchos problemas que hay que anticipar para poder usarla a pleno rendimiento y sin errores que trastoquen nuestro trabajo, por no mencionar nuestro tiempo editando nuestra web.

File_get_contents _curl

Con esta función quedan solventados muchos de esos problemas, aunque cada servidor es un mundo…

Para su uso, después de añadir la función en nuestro “php”, solo hay que sustituir la referencia a “ file_get_contents ” por “file_get_contents_curl”; teniendo el cuidado de añadir “[0]” a la variable que recoge el resultado, porque en este caso es un “array” de dos dimensiones:

File_get_contents vs cURL array

En la segunda dimensión se encuentran los encabezados devueltos por la página solicitada…

/*==================================
Esta función recoge el contenido de la web pasada en "$url" y los encabezados devueltos por ella...

@return    	array[0]    Contenido de la página deseada...
        	array[1]    Array con las cabeceras devueltas...
==================================*/
function file_get_contents_curl( $url,  $javascript_loop = 0, $timeout = 5 )
{
    $url = str_replace( "&", "&", urldecode(trim($url)) );

    $cookie = tempnam ("/tmp", "CURLCOOKIE");
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $ch, CURLOPT_ENCODING, "" );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );    # necesario para https...
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
    $content = curl_exec( $ch );
    $response = curl_getinfo( $ch );
    curl_close ( $ch );

    if ($response['http_code'] == 301 || $response['http_code'] == 302)
    {
        ini_set("user_agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1");

        if ( $headers = get_headers($response['url']) )
        {
            foreach( $headers as $value )
            {
                if ( substr( strtolower($value), 0, 9 ) == "location:" )
                    return file_get_contents_curl( trim( substr( $value, 9, strlen($value) ) ) );
            }
        }
    }

    if (    ( preg_match("/>[[:space:]]+window\.location\.replace\('(.*)'\)/i", $content, $value) || preg_match("/>[[:space:]]+window\.location\=\"(.*)\"/i", $content, $value) ) &&
            $javascript_loop < 5
    )
    {
        return file_get_contents_curl( $value[1], $javascript_loop+1 );
    }
    else
    {
        return array( $content, $response );
    }
}

P.D.: Si este artículo te ha sido de utilidad, por favor, considera tomar un minuto y pulsar en alguno de los enlaces de publicidad. El objetivo es pagar el hosting año a año, nada más, y nada menos…

Gracias.