2010-04-26 20 views
6

Estoy tratando de comprobar si un proceso que ya está en marcha mediante el uso de un archivo temporal demo.lock:Verificando un proceso php ya se está ejecutando

demo.php:

<?php 
    $active=file_exists('demo.lock'); 
    if ($active) 
    { 
     echo 'process already running'; 
    } 
    else 
    { 
     file_put_contents ('demo.lock', 'demo'); 
     sleep(10); //do some job 
     unlink ('demo.lock'); 
     echo 'job done'; 
    } 
?> 

sin embargo, doesn Parece que funciona: si abro demo.php dos veces, siempre se muestra "trabajo hecho", ¿tal vez porque considera que es el mismo proceso? ¿Hay alguna forma de hacerlo? También probé con getmypid() con resultados similares.

Gracias

+0

yo sugeriría que utiliza un mutex llamado así por una cosa así, pero no sabe si los que están disponibles en php .. también –

+0

¿Cuál es tu sistema operativo? – zneak

+0

Lo he intentado tanto en una Windows como en una máquina Linux, con los mismos resultados – Borgtex

Respuesta

0

Bueno, el envío de algunos encabezados y rubores parece funcionar para mí (no estoy seguro por qué), así que ahora cuando lo cargo la página muestra "Inicio" y si presiono el botón Actualizar en el navegador antes de completar el proceso, la advertencia mensaje:

<?php 

$file = @fopen("demo.lock", "x"); 
if($file === false) 
{ 
    echo "Unable to acquire lock; either this process is already running, or permissions are insufficient to create the required file\n"; 
    exit; 
} 

header("HTTP/1.0 200 OK"); 
ob_start(); 
echo "Starting"; 
header('Content-Length: '.ob_get_length(),true); 
ob_end_flush(); 
flush(); 

fclose($file); // the fopen call created the file already 
sleep(10); // do some job 
unlink("demo.lock");  
?> 

Gracias por todas las respuestas y sugerencias hasta ahora

2

Trabaja para mí.

Asegúrese de que el script pueda crear un archivo en el directorio. Descomente la línea "desvincular" y ejecute la secuencia de comandos y compruebe si el archivo de bloqueo existe en el directorio. Si no lo ves, entonces es un problema de permisos de directorio.

+0

Me parece extraño que tampoco funcione. Sin embargo, PHP debería enviar una advertencia si los permisos eran incorrectos. – zneak

+0

¿Ha intentado comentar la línea "desvincular"? (Lo siento, este es @Borgtex) @zneak tal vez no está viendo las advertencias/errores ... – zaf

+0

Los permisos son correctos y en una sola ejecución, el archivo se crea y luego se elimina, no parece haber ningún problema con eso . El problema es que cuando ejecuto este archivo en un navegador y digamos 5 segundos después de volver a llamarlo en otra pestaña, esa segunda instancia, en lugar de mostrar el mensaje de advertencia (porque el primero ya se está ejecutando y el archivo ya está creado)) hace todo el proceso de nuevo. Si creo una copia exacta llamada demo2.php y la ejecuto una tras otra, funciona como se esperaba; demo demora 10 segundos y demo2 muestra instantáneamente la advertencia – Borgtex

2

No puedo estar seguro de lo que está mal en su caso específico asumiendo un entorno "normal, fácil" porque me funciona, pero al menos tiene una condición de carrera en su código. ¿Qué pasa si inicia dos procesos al mismo tiempo, y que ambos encuentran que demo.lock no existe?

Puede usar fopen con el modo x para evitar que esto suceda. El modo X intenta crear el archivo; si ya existe, falla y genera un error E_WARNING (de ahí el operador de desconexión). Como las operaciones del sistema de archivos son atómicas en una unidad, se garantiza que solo un proceso a la vez puede contener el archivo.

<?php 

$file = @fopen("demo.lock", "x"); 
if($file === false) 
{ 
    echo "Unable to acquire lock; either this process is already running, or permissions are insufficient to create the required file\n"; 
    exit; 
} 

fclose($file); // the fopen call created the file already 
sleep(10); // do some job 
unlink("demo.lock"); 
echo "Job's done!\n"; 

?> 

Lo he probado aquí y parece funcionar.

+0

+1 para la prueba atómica – oedo

+0

gracias por la sugerencia, veo cómo el uso de fopen agrega otro nivel de seguridad a la comprobación. Sin embargo, todavía tengo el mismo problema; Es como si la segunda instancia esperara que termine la primera y borre el archivo para crearlo de nuevo – Borgtex

+0

@Borgtex: entonces tu problema me supera. No puedo ver por qué falla. :/Bueno, al menos espero haber sido útil. – zneak

Cuestiones relacionadas