file_get_contents()
es la forma más optimizada para leer archivos en PHP, sin embargo - ya que estás leyendo los archivos en la memoria que siempre está limitado a la cantidad de memoria disponible.
Puede emitir un ini_set('memory_limit', -1)
si tiene los permisos adecuados, pero igual estará limitado por la cantidad de memoria disponible en su sistema, esto es común en todos los lenguajes de programación.
La única solución es leer el archivo en trozos, para que pueda utilizar file_get_contents()
con los argumentos cuarto y quinto ($offset
y $maxlen
- se especifica en bytes):
string file_get_contents(string $filename[, bool $use_include_path = false[, resource $context[, int $offset = -1[, int $maxlen = -1]]]])
Aquí está un ejemplo donde utilizo esta técnica para servir archivos de descarga grandes:
public function Download($path, $speed = null)
{
if (is_file($path) === true)
{
set_time_limit(0);
while (ob_get_level() > 0)
{
ob_end_clean();
}
$size = sprintf('%u', filesize($path));
$speed = (is_int($speed) === true) ? $size : intval($speed) * 1024;
header('Expires: 0');
header('Pragma: public');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $size);
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
header('Content-Transfer-Encoding: binary');
for ($i = 0; $i <= $size; $i = $i + $speed)
{
ph()->HTTP->Flush(file_get_contents($path, false, null, $i, $speed));
ph()->HTTP->Sleep(1);
}
exit();
}
return false;
}
Otra opción es el uso de los archivos s optimizado fopen()
, feof()
, fgets()
y fclose()
funciones, especialmente si se preocupan por conseguir líneas enteras a la vez, aquí es another example I provided in another StackOverflow question for importing large SQL queries into the database:
function SplitSQL($file, $delimiter = ';')
{
set_time_limit(0);
if (is_file($file) === true)
{
$file = fopen($file, 'r');
if (is_resource($file) === true)
{
$query = array();
while (feof($file) === false)
{
$query[] = fgets($file);
if (preg_match('~' . preg_quote($delimiter, '~') . '\s*$~iS', end($query)) === 1)
{
$query = trim(implode('', $query));
if (mysql_query($query) === false)
{
echo '<h3>ERROR: ' . $query . '</h3>' . "\n";
}
else
{
echo '<h3>SUCCESS: ' . $query . '</h3>' . "\n";
}
while (ob_get_level() > 0)
{
ob_end_flush();
}
flush();
}
if (is_string($query) === true)
{
$query = array();
}
}
return fclose($file);
}
}
return false;
}
la técnica que utilice realmente va a depender de lo que estamos tratando de hacer (como puede ver con la función de importación de SQL y la función de descarga), pero siempre tendrá que leer los datos en los trozos.
* (de referencia) * http://www.ibm.com/developerworks/library/os-php-readfiles/ – Gordon
Esta pregunta es un poco antigua, pero para referencia futura, encontré [este sitio] (http://www.raditha.com/wiki/Readfile_vs_include) hace algún tiempo. Analizó varios métodos de lectura de PHP y concluyó que 'readfile()' y 'fpassthru' son los más rápidos, siempre que no requiera ningún procesamiento de ese archivo (es decir, no hay scripts PHP dentro del archivo que deba procesarse). – jmbertucci
Aquí hay varios métodos importantes de PHP para obtener contenido, y probarlos con 'echo microtime' antes de iniciar la función, y después de la función hacer de nuevo' echo microtime' y ver los resultados: http://stackoverflow.com/questions/2176180/get -content-from-a-url-using-php –