una - eliminar usuario mysql php
¿Cómo usar PHP para eliminar un número X de líneas desde el comienzo de un archivo de texto? (8)
Los sistemas operativos típicos no ofrecen la capacidad de insertar o eliminar el contenido de un archivo "en el lugar". Lo que tendrá que hacer es escribir una función que lea el primer archivo y cree un nuevo archivo de salida que contenga las líneas que desea conservar. Luego, cuando haya terminado, elimine el archivo anterior y cambie el nombre del nuevo al anterior.
En pseudocódigo:
open original file IN for reading
create new output file OUT
read the first two lines from IN
write these lines to OUT
for each line to skip:
read a line from IN
for the remainder of the file:
read a line from IN
write the line to OUT
close IN
close OUT
delete IN
rename OUT to IN
La ventaja de este método sobre algunos de los otros presentados es que no requiere que primero lea todo el archivo en la memoria. No mencionó qué tan grande era su límite de tamaño superior, pero si es algo así como 100 MB, es posible que la carga del archivo en la memoria no sea un uso aceptable del espacio.
Estoy escribiendo un script PHP y el script genera un registro de archivo de texto simple de las operaciones que realiza. ¿Cómo usaría PHP para eliminar las primeras líneas de este archivo cuando alcance un determinado tamaño de archivo?
Idealmente, me gustaría que mantenga las dos primeras líneas (fecha / hora creadas y en blanco) y comience a eliminar de la línea 3 y elimine X cantidad de líneas. Ya sé sobre la función filesize()
, así que la usaré para verificar el tamaño del archivo.
Ejemplo de texto de registro:
*** LOG FILE CREATED ON 2008-10-18 AT 03:06:29 ***
2008-10-18 @ 03:06:29 CREATED: gallery/thumbs
2008-10-18 @ 03:08:03 RENAMED: gallery/IMG_9423.JPG to gallery/IMG_9423.jpg
2008-10-18 @ 03:08:03 RENAMED: gallery/IMG_9188.JPG to gallery/IMG_9188.jpg
2008-10-18 @ 03:08:03 RENAMED: gallery/IMG_9236.JPG to gallery/IMG_9236.jpg
2008-10-18 @ 03:08:03 RENAMED: gallery/IMG_9228.JPG to gallery/IMG_9228.jpg
2008-10-18 @ 03:08:03 RENAMED: gallery/IMG_3104.JPG to gallery/IMG_3104.jpg
2008-10-18 @ 03:08:03 RENAMED: gallery/First dance02.JPG to gallery/First dance02.jpg
2008-10-18 @ 03:08:03 RENAMED: gallery/BandG02.JPG to gallery/BandG02.jpg
2008-10-18 @ 03:08:03 RENAMED: gallery/official03.JPG to gallery/official03.jpg
2008-10-18 @ 03:08:03 RENAMED: gallery/Wedding32.JPG to gallery/Wedding32.jpg
2008-10-18 @ 03:08:03 RENAMED: gallery/Gettaway car16.JPG to gallery/Gettaway car16.jpg
2008-10-18 @ 03:08:04 CREATED: gallery/thumbs/Afterparty05.jpg
2008-10-18 @ 03:08:04 CREATED: gallery/thumbs/IMG_9254.jpg
2008-10-18 @ 03:08:04 CREATED: gallery/thumbs/IMG_9175.jpg
2008-10-18 @ 03:08:04 CREATED: gallery/thumbs/official05.jpg
2008-10-18 @ 03:08:04 CREATED: gallery/thumbs/First dance01.jpg
2008-10-18 @ 03:08:04 CREATED: gallery/thumbs/Wedding29.jpg
2008-10-18 @ 03:08:04 CREATED: gallery/thumbs/men walking.jpg
Puede usar la función file () para leer el archivo en una matriz de líneas, luego use array_slice () para eliminar las primeras líneas X.
$X = 100; // Number of lines to remove
$lines = file(''log.txt'');
$first_line = $lines[0];
$lines = array_slice($lines, $X + 2);
$lines = array_merge(array($first_line, "/n"), $lines);
// Write to file
$file = fopen(''log.txt'', ''w'');
fwrite($file, implode('''', $lines));
fclose($file);
Si puede ejecutar un comando de Linux, intente split
. Le permite dividir por recuento de líneas para facilitar las cosas.
De lo contrario, creo que tendrás que leerlo y escribir en otros 2 archivos.
$x_amount_of_lines = 30;
$log = ''path/to/log.txt'';
if (filesize($log) >= $max_size)) {
$file = file($log);
$line = $file[0];
$file = array_splice($file, 2, $x_amount_of_lines);
$file = array_splice($file, 0, 0, array($line, "/n")); // put the first line back in
...
}
editar: con corrección desde bycar y guardar la primera línea.
Este es un problema de libro de texto de archivos de registro, y me gustaría proponer otra solución.
El problema con el enfoque de "eliminar líneas al principio de los archivos" es que la adición de nuevas líneas se vuelve extremadamente lenta, una vez que tiene que eliminar las primeras líneas para cada nueva línea que está escribiendo.
El archivo de registro normal que se agrega solo implica escribir unos pocos bytes más al final del archivo en el sistema de archivos (y de vez en cuando tiene que asignar un nuevo sector, lo que da como resultado una gran fragmentación; por qué los archivos de registro usualmente).
Pero el gran problema aquí es cuando quitas una línea al principio para cada fila escrita. El archivo completo primero debe leerse en la memoria y luego reescribirse, lo que da como resultado una gran cantidad de E / S en el disco duro (en comparación). Para empeorar las cosas, las soluciones de "dividir en PHP array y omitir primeras filas" aquí son extremadamente lentas debido a la naturaleza de las matrices PHP. Esto no es un problema si el límite de tamaño del archivo de registro es muy pequeño o si se escribe a menudo, pero con muchas escrituras (como en el caso de los archivos de registro), la misma gran operación tiene que hacerse muchas veces. dando como resultado importantes inconvenientes de rendimiento.
Esto se puede imaginar como estacionar autos en una línea con espacio para 50 personas. Estacionar los primeros 50 automóviles es rápido, solo conduzca detrás del automóvil y listo. Pero cuando llegas a los 50, y el automóvil de la parte delantera (principio del archivo) debe ser removido, tienes que conducir el auto de 2 a la posición 1, 3 ° a 2 ° y así sucesivamente, antes de que puedas conducir con el último automóvil en la posición 50 °. (¡Y esto debe repetirse por cada auto nuevo que desee estacionar!)
Mi sugerencia es, en cambio, guardar en diferentes archivos de registro, en la fecha, y luego almacenar un máximo de 30 días, etc. Aprovechando así el sistema de archivos, que ya ha resuelto este problema perfectamente.
Usa el SPL, Luke
PHP 5 viene con un montón de bondades de iteradores:
<?php
$line_to_strip = 5;
$new_file = new SplFileObject(''test2.log'', ''w'');
foreach (new LimitIterator(new SplFileObject(''test.log''), $line_to_strip) as $line)
$new_file->fwrite($line);
?>
Es más claro que lo que puede hacer mientras juega con fopen, no retiene todo el archivo en la memoria, solo una línea a la vez, y puede enchufarlo y reutilizar el patrón en cualquier lugar ya que está lleno de OO.
Como alternativa a la respuesta de @ Greg , puede leer todo el archivo en una matriz, omitir las primeras X muchas entradas, y luego volver a escribir la matriz en el archivo.
Como enfoque: http://us3.php.net/manual/en/function.file-get-contents.php
$fle = file_get_contents("filename");
// skip X many newlines, overwriting the contents of the string with ""
// http://us3.php.net/manual/en/function.file-put-contents.php
file_put_contents("filename", $fle);
Aquí hay una función lista para usar
<?php
//--------------------------------
// FUNCTION TO TRUNCATE LOG FILES
//--------------------------------
function trim_log_to_length($path,$numHeaderRows,$numRowsToKeep){
$file = file($path);
$headerRows = array_slice($file,0,$numHeaderRows);
// if this file is long enough were we should be truncating it
if(count($file) - $numRowsToKeep > $numHeaderRows){
// figure out the rows we wanna keep
$dataRowsToKeep = array_slice($file,count($file)-$numRowsToKeep,$numRowsToKeep);
// write the file
$newFileRows = array_merge($headerRows,$dataRowsToKeep);
file_put_contents($path, implode($newFileRows));
}
}
?>