2009-09-04 5 views
1

Je sais que c'est un peu générique, mais je suis sûr que vous comprendrez mon explication. Voici la situation:Comment restaurer ce script après une panne matérielle?


Le code suivant est exécuté toutes les 10 minutes. La variable "var_x" est toujours lue/écrite dans un fichier texte externe lorsqu'il est référencé.

if (var_x != 1) 
{ 
    var_x = 1; 
    // 
    // here is where the main body of the script is. 
    // it can take hours to completely execute. 
    // 
    var_x = 0; 
} 
else 
{ 
    // exit script as it's already running. 
} 

Le problème est: si je simule une panne matérielle (faire une réinitialisation matérielle lorsque le script est en cours d'exécution) alors la logique principale de script ne sera jamais exécuter à nouveau parce que « var_x » sera toujours « 1 » . (J'ai déjà la logique de travailler sur le point de restauration).

Merci.

+0

Pour une raison quelconque, Flock ne semble pas fonctionner pour moi. Flock semble seulement retarder le code jusqu'à ce que le fichier devienne libre ce qui n'est pas ce que je veux. – Cheetah

Répondre

6

Vous devez verrouiller et déverrouiller des fichiers avec flock:

$fp = fopen($your_file); 
if (flock($fp, LOCK_EX)) {) 
{ 
    // 
    // here is where the main body of the script is. 
    // it can take hours to completely execute. 
    // 
    flock($fp, LOCK_UN); 
} 
else 
{ 
    // exit script as it's already running. 
} 

Edit:

Comme troupeau semble ne pas fonctionne correctement sur les machines Windows, vous devez recourir à d'autres solutions. Du sommet de la tête une idée pour une solution possible:

Au lieu d'écrire 1 à var_x, écrire l'ID du processus récupéré via getmypid. Lorsqu'une nouvelle instance du script lit le fichier, il doit rechercher un processus en cours avec cet ID et si le processus est un script PHP. Bien sûr, cela peut toujours mal tourner, car il est possible qu'un autre script PHP obtienne le même PID après une panne matérielle, donc la solution est loin d'être optimale.

+0

+1 pour votre effort – Dooltaz

+0

un autre +1. Merci pour l'effort mate. – Cheetah

+0

Je ne peux pas voter :(pas assez de réponse – Cheetah

0

Il semble que vous fassiez une sorte de sémaphore manuel pour la gestion des processus.

Plutôt que d'écrire dans un fichier, vous devriez peut-être utiliser un environment variable à la place. Ainsi, en cas d'échec, votre script n'aura pas de sémaphore fermé lors de la restauration.

+0

de PHP.net: 'Attention: Ces directives n'ont d'effet que lorsque le mode sécurisé lui-même est activé!' – scragar

+0

vrai, la réponse de scragar est bien meilleure pour PHP. Je pensais seulement en général. –

5

Ne pensez-vous pas que cela serait mieux résolu en utilisant des verrous de fichiers? (Lorsque la réinitialisation se verrouille de fichiers sont remis à zéro ainsi)

http://php.net/flock

+0

Du haut de ma tête (y penser) - parfait. – Cheetah

+0

Vous me battez pendant que j'écris le code;) – Residuum

Questions connexes