Tengo la necesidad de actualizar una secuencia de comandos Perl CGI donde los usuarios deben completar 3 pasos. Después de que terminen cada paso, el script está registrando qué paso finalizó el usuario. Tener un registro de esto es importante para que podamos demostrarle al usuario que solo terminaron el primer paso y que no completaron los tres pasos, por ejemplo.Concurrente se agrega al mismo archivo con Perl
En este momento, el script está creando 1 archivo de registro para cada instancia del script CGI. Entonces, si UserA hace el paso 1, entonces el usuario B hace el paso 1, luego el paso 2, luego el paso 3, y luego el usuario A termina el paso 2 y el paso 3, el orden de los archivos de registro sería.
LogFile.UserA.Step1
LogFile.UserB.Step1
LogFile.UserB.Step2
LogFile.UserB.Step3
LogFile.UserA.Step2
LogFile.UserA.Step3
Los archivos de registro se denominan con la fecha y hora actual, un número aleatorio, y el proceso PID.
Esto funciona bien para evitar que el mismo archivo se escriba más de una vez, pero el directorio obtiene rápidamente miles de archivos (cada archivo contiene solo unos pocos bytes). Hay un proceso para rotar y comprimir estos registros, pero me ha tocado hacerlo para que el script inicie sesión en un solo archivo por día para reducir la cantidad de archivos de registro que se crean.
Básicamente, el archivo de registro tendrá la fecha actual en el nombre del archivo, y cada vez que el script CGI necesite escribir en el registro, se agregará al único archivo de registro para ese día, independientemente del usuario o qué paso están encendidos
No será necesario leer el archivo de registro; lo único que le sucederá será un apéndice del script CGI. La rotación del registro se ejecutará en archivos de registro de 7 días o más.
Mi pregunta es, ¿cuál es la mejor manera de manejar los adjuntos concurrentes a este archivo de registro? ¿Debo cerrarlo antes de agregar? Encontré this page en Perl Monks que parece indicar que "cuando varios procesos escriben en el mismo archivo, y todos tienen el archivo abierto para anexar, los datos no se sobrescribirán".
He aprendido que el hecho de que se pueda hacer no significa que deba hacerlo, pero en este caso, ¿cuál es la forma más segura y práctica de hacerlo?
Resumen:
- concurrente anexa al mismo archivo
- Cada final del archivo es sólo una línea, a menos de 50 caracteres
- orden no importa
Gracias!
gbacon hace este derecho, sino algo importante para recordar la hora de adaptar su código: usted * No * desbloqueo ('LOCK_UN') el archivo - que lo cierre. Eso asegurará que los datos se descarguen y * luego * lo desbloqueen. – hobbs
Gracias gbacon. El orden no es importante, entonces eso no es un problema. No estoy del todo seguro de si necesito bifurcar en mi caso. Como se trata de una secuencia de comandos CGI (no una CGI rápida, no permanece activa), el usuario solo podrá realizar 1 paso durante la vida del script: una vez que completa un paso, la secuencia de comandos se cerrará.Luego, en la web, está trabajando en el paso 2, hits submit, el paso 2 se registrará y el script se cerrará. – BrianH
@BrianH No estaba claro: los niños bifurcados simulan múltiples clientes concurrentes. En su programa CGI, llame a un sub similar a 'log_step' de mi respuesta para registrar la finalización de un paso por un usuario real. –