Foros del Web » Programando para Internet » PHP »

Función para Lock Archivos y Concurrencia de Usuarios

Estas en el tema de Función para Lock Archivos y Concurrencia de Usuarios en el foro de PHP en Foros del Web. Hola a todos , he usado en alguna ocasión la función flock de PHP , pero veo que a veces falla o no es multiplataforma ...
  #1 (permalink)  
Antiguo 20/12/2014, 10:03
 
Fecha de Ingreso: noviembre-2007
Mensajes: 498
Antigüedad: 16 años, 4 meses
Puntos: 20
De acuerdo Función para Lock Archivos y Concurrencia de Usuarios

Hola a todos , he usado en alguna ocasión la función flock de PHP , pero veo que a veces falla o no es multiplataforma , debido a ello he creado una función que me gustaría presentar aqui para que la valoraseís y me deís vuestra opinión , aqui os pongo la misma :

Código PHP:
<?php
function lock_ip($ruta_temp_folder,$database_name)
{

global 
$group_lock

$te=0;
$dir=opendir("".$ruta_temp_folder."");

while(
$file=readdir($dir))
{

if (
$file!="." && $file!="..")
{

$fil_test="".$database_name.""

$fil_exp=explode("_",$file);

if (
$fil_exp[1]=="".$fil_test."")
{   
$group_lock[]="".fileatime("".$ruta_temp_folder."/".$file."")."-".$file."";
}

$te++;  
}   

}
closedir($dir);

natsort($group_lock);


}
?>

<?php
lock_ip
("temp","users.dat");
?>

<?php
function control($value,$position,$ruta_lock_file)
{

global 
$continue_process;

if (
$_SERVER['REMOTE_ADDR']=="".$value."" && $position==0)
{
unlink("".$ruta_lock_file."");
$continue_process="ok";
return;
}
else
{   
usleep(1000*$position); 
}   
}
?>

<?php
$x
=0;
foreach(
$group_lock as $group_locks)
{
$exp=explode("-",$group_locks);

$exp2=explode("_",$exp[1]);

control($exp2[0],$x,"temp/".$exp[1]."");

$x++;   
}
?>

<?php
if($continue_process=="ok")
{
$fil=file("users.dat");
$fp=fopen("users.dat","w");

for(
$i=0;$i<sizeof($fil);$i++)
{
fputs($fp,"".trim($fil[$i]).""."\n");   
}

fputs($fp,"".date("dmY H:i:s").""."\n");
fclose($fp);
}
?>


Lo que hace la función es quw para una base de datos en texto dada , por ejemplo como el caso que pongo llamada "users.dat" , cuando se empieza se crea en la carpeta temp un archivo , el cual sirve para secuenciar la escritura al archivo principal que es users.dat


Cuando esto pasa , en la carpeta temp , se crea ese temporal , es decir si por ejemplo varios usuarios quieren acceder al mismo archivo el sistema creara para cada uno un archivo temporal según su ip , despues de esto con fileatime el sistema vería cual es el archivo más antiguo y más nuevo y en función de eso procedería a ir dejando pasar los más antiguos para escribir al archivo y luego los más nuevos , para hacer esto he creado un apartado que retarda la función con usleep multiplicando el valor base por la posición final de cada archivo , luego se cierra el ciclo cuando se deja paso y se borra el temporal pudiendo escribir al archivo base de "users.dat"

Me gustaría poder hablar con más gente sobre esta función que he creado para ver que opinan y si se puede mejorar pues también

Un saludo y muchas gracias :)

Etiquetas: concurrencia, lock, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:47.