Supongo que es fgets, pero no puedo encontrar la sintaxis específica. Estoy tratando de leer (en una cadena que estoy pensando es más fácil) la última línea que se añade a un archivo de registro.

OriginalEl autor waxical | 2009-06-30

9 Comentarios

  1. 41

    El más simple ingenuo solución es simple:

    $file = "/path/to/file";
    $data = file($file);
    $line = $data[count($data)-1];

    Embargo, este SE carga el archivo de la memoria. Posiblemente un problema (o no). Una mejor solución es esta:

    $file = escapeshellarg($file); //for the security concious (should be everyone!)
    $line = `tail -n 1 $file`;
    Tenga en cuenta que esto es muy peligroso, a menos que usted está utilizando escapeshellarg(): de.php.net/manual/en/function.escapeshellarg.php
    Corrección, es sólo peligroso si estás aceptar la entrada del usuario como la ruta del archivo (y, a continuación, usted debe hacer todo tipo de cosas para validar). Si utiliza una constante, como en el ejemplo, entonces es perfectamente bien y usted puede ahorrar una llamada a una función. Por supuesto, probablemente no es una mala idea, de todos modos, sólo para conseguir en el hábito.
    La ampliación de su comentario un poco más abajo («Si estás en un Mac…?») – ¿Y si estás en Windows y no tiene la «cola» de comandos? (Sé que hay una Win32 puerto de «cola», que al lado de los de punto). Aparte de eso, aunque no lo he probado no me sorprendería si la creación de un nuevo proceso por cada petición no escala muy bien.
    Sería bueno si se incluyen el resto de el código necesario en el escapeshellarg ejemplo. La creación de una cadena no por arte de magia obtener la última línea de la nada.
    Nope; la shell a tail hace eso. Nada en la vida es magia, tristemente.

    OriginalEl autor Matthew Scharley

  2. 13

    Esto parece que es lo que está buscando:

    tekkie.flashbit.net: Cola de funcionalidad en PHP

    Se implementa una función que utiliza el fseek() con un índice negativo que se suba el archivo de la final. Usted puede definir el número de líneas que desea ser devueltos.

    El código también está disponible como una Esencia en GitHub:

    //full path to text file
    define("TEXT_FILE", "/home/www/default-error.log");
    //number of lines to read from the end of file
    define("LINES_COUNT", 10);
    
    
    function read_file($file, $lines) {
        //global $fsize;
        $handle = fopen($file, "r");
        $linecounter = $lines;
        $pos = -2;
        $beginning = false;
        $text = array();
        while ($linecounter > 0) {
            $t = " ";
            while ($t != "\n") {
                if(fseek($handle, $pos, SEEK_END) == -1) {
                    $beginning = true; 
                    break; 
                }
                $t = fgetc($handle);
                $pos --;
            }
            $linecounter --;
            if ($beginning) {
                rewind($handle);
            }
            $text[$lines-$linecounter-1] = fgets($handle);
            if ($beginning) break;
        }
        fclose ($handle);
        return array_reverse($text);
    }
    
    $fsize = round(filesize(TEXT_FILE)/1024/1024,2);
    
    echo "<strong>".TEXT_FILE."</strong>\n\n";
    echo "File size is {$fsize} megabytes\n\n";
    echo "Last ".LINES_COUNT." lines of the file:\n\n";
    
    $lines = read_file(TEXT_FILE, LINES_COUNT);
    foreach ($lines as $line) {
        echo $line;
    }
    Iiinteresting… pero absolutamente inútil junto al método mucho más fácil de sólo bombardeo de la cuestión a la cola (a menos que usted realmente está en una muy serio exceso de trabajo del servidor)
    «completamente inútil» es un poco duro
    Ok, tal vez un poco… aún así, me gustaría ser reacio a usarlo, a menos que alguien pueda demostrar que el uso de tail en realidad era lo que estaba causando los cuellos de botella y no el de las operaciones en bases de datos grandes.
    Bien crud, ahora vas a hacer que me vaya de referencia no se… porque soy curioso…
    Yo soy, demasiado. Por lo que si punto de referencia, me gustaría estar interesados en sus resultados. 🙂 Lo ideal sería que se prueba en un archivo de registro que es demasiado grande para caber en la caché del sistema de archivos.

    OriginalEl autor Tomalak

  3. 8
    define('YOUR_EOL', "\n");
    $fp = fopen('yourfile.txt', 'r');
    
    $pos = -1; $line = ''; $c = '';
    do {
        $line = $c . $line;
        fseek($fp, $pos--, SEEK_END);
        $c = fgetc($fp);
    } while ($c != YOUR_EOL);
    
    echo $line;
    
    fclose($fp);

    Esto es mejor, ya que no se carga el archivo completo en la memoria…

    Conjunto YOUR_EOL para su correcta finales de línea, si usted utiliza la misma línea de terminaciones como el valor predeterminado finales de línea del sistema operativo donde su guión reside, usted puede utilizar la constante PHP_EOL.

    OriginalEl autor Jeroen Serpieters

  4. 4
    function seekLastLine($f) {
        $pos = -2;
        do {
            fseek($f, $pos--, SEEK_END);
            $ch = fgetc($f);
        } while ($ch != "\n");
    }

    -2 porque en los últimos char puede ser \n

    OriginalEl autor constantined

  5. 3

    Usted tiene que leer el archivo línea por línea y guardar la última línea de lectura para conseguirlo.

    O si en unix/linux, usted podría considerar la posibilidad de utilizar el comando de shell de la cola

    tail -n 1 filename

    OriginalEl autor jitter

  6. 1

    Este no break para un 1 o 0 en el archivo de la línea.

    function readlastline($fileName)
    {
    
           $fp = @fopen($fileName, "r");
           $begining = fseek($fp, 0);      
           $pos = -1;
           $t = " ";
           while ($t != "\n") {
                 fseek($fp, $pos, SEEK_END);
                 if(ftell($fp) == $begining){
                  break;
                 }
                 $t = fgetc($fp);
                 $pos = $pos - 1;
           }
           $t = fgets($fp);
           fclose($fp);
           return $t;
    }

    OriginalEl autor unique_stephen

  7. 1

    …¿Por qué acabo de leer la última línea?

    function readLines($fp, $num) {
    
        $line_count = 0; $line = ''; $pos = -1; $lines = array(); $c = '';
    
        while($line_count < $num) {
            $line = $c . $line; 
            fseek($fp, $pos--, SEEK_END);
            $c = fgetc($fp);
            if($c == "\n") { $line_count++; $lines[] = $line; $line = ''; $c = ''; }
        }   
        return $lines;
    }
    
    $filename = "content.txt";
    $fp = @fopen($filename, "r");
    
    print_r(readLines($fp, 2));
    
    fclose($fp);
    Porque eso es lo que el OP sea necesario? lol

    OriginalEl autor Simon Harper

  8. 0

    Si quieres leer un archivo línea por línea el archivo función lee el contenido de un archivo, línea por línea, y devuelve cada línea como un elemento de una matriz.

    Para que pudiera hacer algo tan simple como:

    $lines    = file('log.txt');
    $lastLine = array_pop($lines);
    De verdad? Para una multi-megabyte archivo de registro de que el 99,99% es de ningún interés para mí, me gustaría tratar de evitar la carga de todos en una matriz sólo tirarlo a la basura inmediatamente.
    No se puede negar que esta es ineficiente, pero funciona; y quién sabe cuánto tiempo el archivo es? Me gustaría utilizar la cola de comandos en mi entorno, pero WiseDonkey no se especifica ninguna. Esa es una buena función que enlaza, a pesar de.
    archivo() y file_get_contents() son los dos grandes funciones de manipulación de archivos, especialmente si usted sabe los archivos implicados son relativamente pequeños, y sólo quiero hacer algo de forma rápida y sencilla.
    Scharley: El OP habló de archivos de registro. Estos son el opuesto de «relativamente pequeña» la mayoría del tiempo.

    OriginalEl autor Kieran Hall

  9. 0

    @unique_stephen, su respuesta es errónea. PHP el fseek devuelve 0 para el éxito y -1 para el fracaso. Almacenar el resultado en $principio (sic) y, a continuación, después de usarlo en un filtro para ftell() no es correcta. Si mi reputación eran más altos que yo hubiera votado abajo y deja un comentario. Aquí es una versión modificada de unique_stephen de la función.

    function readlastline($fileName)
    {
        $fp = @fopen($fileName, "r");
        if (fseek($fp, 0) == -1)
            exit('Cannot seek to beginning of the file'); 
        $pos = -1;
        $t = " ";
        while ($t != "\n") {
            if (fseek($fp, $pos, SEEK_END) == -1)
                exit('Cannot seek to the end of the file');
            if (ftell($fp) == 0) {
                break;
            }
            $t = fgetc($fp);
            $pos = $pos - 1;
        }
        $t = fgets($fp);
        fclose($fp);
        return $t;
    }

    NOTA: PHP, el fseek no administrar a buscar hasta el final de los archivos de más de PHP_MAX_INT que es de 32 bits firmado incluso en 64 bits binarios.

    Esto no proporciona una respuesta a la pregunta. Una vez que usted tiene suficiente la reputación usted será capaz de comentario en cualquier post; en su lugar, proporcionar las respuestas que no requieren de aclaraciones a la persona que pregunta. – De Revisión
    Sí, hay respuestas a la pregunta ya. El problema con no ser capaz de dejar un comentario en respuesta a lo que necesita ser resuelto si no me quiero dejar una respuesta como un comentario. Voy a editar la respuesta a dar una versión correcta de @unique_stephen la respuesta.

    OriginalEl autor Earnie

Dejar respuesta

Please enter your comment!
Please enter your name here