Alternativa a file_get_contents() en PHP

17 Dic 2010

Resulta frecuente que descarguemos una librería PHP, un plugin o que copiemos un snippet desde alguna página web amiga pero, a la hora de ejecutarlo, la configuración de nuestro servidor tenga restringidas ciertas acciones.

Con la función file_get_contents() suele ocurrir: la mayoría de proveedores de hostings tienen deshabilitada la función allow_url_open necesaria para su funcionamiento. Por tanto, hay que buscar formas alternativas que resuelvan el problema.

Una de las posibles soluciones es utilizar cURL, aunque esta herramiento tiene también sus propios detractores. Para nuestro ejemplo, crearíamos una función alternativa con la que reemplazaríamos a la problemática file_get_contents().

1
2
3
4
5
6
7
8
9
function getRemoteFile($url, $timeout = 10) {
  $ch = curl_init();
  curl_setopt ($ch, CURLOPT_URL, $url);
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  $file_contents = curl_exec($ch);
  curl_close($ch);
  return ($file_contents) ? $file_contents : FALSE;
}

La función es bastante clara por sí misma: si la URL existe, devuelve su contenido; de lo contrario, devuelve el booleano FALSE.

Más:

{5} Comentarios.

  1. fcodiaz

    algo loko consultar de forma remota un archivo que se tiene local :-/, eso si odio las limitaciones de funciones en hosting… U.u.. deberian de publicar las funciones que tienen deshabilitadas y si esta u otras que uses entan en la lista a buscar nuevo provedor por desgracia siempre te das cuenta hasta que ya terminaste el proyecto y ya contrataste el plan mas caro del hosting ¬¬…..

  2. Gabriel

    Tengo un problema y es que uso file_get_contents para forzar la descarga de archivos, pero cuando de trata de archivos mayores a 64KB no funciona.

    Alguna idea?

    • Carlos Benítez

      Hola;
      quizá la respuesta desde el servidor sea más lenta de lo que se espera y se agote el tiempo de espera para el script. Podrías probar con:

      set_time_limit(0);
      

      A ver si así se resuelve tu problema.
      Saludos.

  3. Gabriel

    Hola maestros. Tengo un problema y es el siguiente:

    Yo estoy ocultado una url de descarga y envío los datos con la función file_get_contents. Sin embargo esta función tiene un problema y es que cuando un archivo es mayor de 64 KB aproximadamente no permite descargarlo y envía el contenido del archivo de 1 KB que al abrirlo en bloc de notas logicamente aparece el error de insuficiente memoria.

    Intenté aumentar la memoria con ini_set y solo llega a descargar aproximadamente hasta 64 KB.

    Investigué que la función file_get_contents en la versión 5 de php incluye otros parámetros y en mi caso, bajo mi servidor afortunadamente poseo esta versión.

    El código es el siguiente:

    $ini = 0;
    $total = filesize($ruta_archivo);
    $lon = $total / 10;

    while($ini < $total){
    echo file_get_contents($ruta_archivo,NULL,NULL,$ini,$lon);
    $ini += ($lon + 1);
    }

    Lo que intento hacer es dividir el tamaño del archivo en 10 trozos y enviar cada trozo hasta completar el archivo, pero siempre se presenta el mismo problema de los 64 KB aunque se aumente la memoria con ini_set o se especifique una hora o mas de duracion de script con set_time_limit.

    Alguna sugerencia?

    Gracias por sus amables respuestas

  4. José A. Piñero

    Perfecto tu funcion va de maravilla. Gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *