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 :)