write permisos fputs espaƱol con php file concurrency

permisos - PHP y acceso de archivos concurrente



php fopen fwrite (4)

Debes poner un candado en el archivo

<?php $fp = fopen("/tmp/lock.txt", "w+"); if (flock($fp, LOCK_EX)) { // do an exclusive lock fwrite($fp, "Write something here/n"); flock($fp, LOCK_UN); // release the lock } else { echo "Couldn''t lock the file !"; } fclose($fp); ?>

Eche un vistazo a http://www.php.net/flock

Estoy construyendo una pequeña aplicación web en PHP que almacena cierta información en un archivo de texto sin formato. Sin embargo, todos los usuarios de mi aplicación utilizan / modifican este archivo de texto en un momento dado y posible al mismo tiempo.

Entonces la pregunta es ¿Cuál sería la mejor manera de asegurarse de que solo un usuario pueda realizar cambios en el archivo en cualquier momento dado?


Mi sugerencia es usar SQLite. Es rápido, liviano, se almacena en un archivo y tiene mecanismos para evitar modificaciones simultáneas. A menos que se trate de un formato de archivo preexistente, SQLite es el camino a seguir.


Podría hacer un tipo de registro de commit de formato, más o menos como lo hace wikipedia.

Use una base de datos, y cada cambio guardado crea una nueva fila en la base de datos, que hace que el registro anterior sea redundante, con un valor incrementado, entonces solo tiene que preocuparse de obtener bloqueos de tabla durante la fase de guardado.

De esta manera, al menos si dos personas concurrentes editan algo, ambos cambios aparecerán en el historial y cualquier cosa que se pierda en la guerra de compromiso se puede copiar en la nueva revisión.

Ahora bien, si no desea utilizar una base de datos, debe preocuparse por tener un archivo de control de revisión que respalde cada archivo visible.

Puede poner un control de revisión (GIT / MERCURIAL / SVN) en el sistema de archivos y luego automatizar las confirmaciones durante la fase de guardado,

Pseudocódigo:

user->save : getWritelock(); write( $file ); write_commitmessage( $commitmessagefile ); # <-- author , comment, etc call "hg commit -l $commitmessagefile $file " ; releaseWriteLock(); done.

Al menos de esta manera, cuando 2 personas hacen commits críticos al mismo tiempo, ninguno se perderá.


Un único archivo para muchos usuarios realmente no debería ser la estrategia que utiliza, no creo; de lo contrario, probablemente necesite implementar un solo punto de acceso (global) que monitoree si el archivo está siendo editado o no. Adquirir un bloqueo, hacer su modificación, liberar el bloqueo, etc. Me gustaría ir con ''Nadie sugiere utilizar una base de datos (SQLite si no quiere la sobrecarga de un RDBMS completamente adornado)