2011-01-25 1 views
1

Bien que le titre mentionne le fichier, il ne doit pas nécessairement s'agir d'un fichier. Tout mécanisme de verrouillage ferait l'affaire.Verrouiller le fichier entre C et php

Voici la situation: J'ai un processus démon écrit en C, et une page web en php. Je voudrais avoir un moyen de verrouillage mutuel afin que, dans certaines situations, le démon C verrouille un fichier et php détecte la situation et indique au client que le système est occupé.

Existe-t-il un moyen facile de le faire?

Merci,

Répondre

3

flock-t-il correctement.

Dans votre script PHP, utilisez un verrouillage non bloquant:

$fd = fopen('/var/run/lock.file', 'r+'); 
if (!flock($fd, LOCK_SH | LOCK_NB, $wouldblock) && $wouldblock) { 
    // buzy 
} 

Le drapeau de LOCK_NB faire ce blocage d'appel non. Si le fichier est verrouillé exclusivement, il reviendra immédiatement. Plusieurs pages seront autorisées à verrouiller le fichier en même temps.

Vous pouvez libérer le verrou avec

flock($fd, LOCK_UN); 

Dans votre démon C, utilisez un blocage et un verrou exclusif:

flock(fd, LOCK_EX); // This will wait until no page has locked the file 

Voir la documentation PHP flock() et C de one

1

Si votre application PHP est par base de données, il devrait être facile de mettre à jour une certaine colonne de cette base de données pour indiquer « le système est occupé ».

Votre cronjob définirait et réinitialiserait ce drapeau et votre application PHP pourrait lire sa valeur.

2

Vous pourriez avoir votre démon créer un fichier lorsqu'il est occupé, et retirez-le quand pas, en PHP faire quelque chose comme:

if (file_exists('/path/to/file')) { 
    echo 'System busy'; 
} 
+0

Beaucoup plus facile à faire que d'avoir à frapper la base de données à chaque fois. Tant que le démon prend soin de supprimer le fichier après la fin de la période de verrouillage, il s'agit probablement de l'option la plus simple et la moins fiable. +1 –

+1

mfonda: on dirait qu'il pourrait être victime d'une condition de course. Non? – lang2

+0

Le problème avec ceci est que le démon peut démarrer juste pendant l'appel de file_exits() et créer le fichier juste après l'appel ou à n'importe quel moment pendant l'exécution de la page. – arnaud576875

1

Avez-vous seulement Voulez-vous que PHP détecte que le démon est occupé? Ou voulez-vous réellement qu'ils se fassent la queue? L'utilisation d'un verrou exclusif aurait l'inconvénient que le démon C devra attendre que toutes les instances PHP terminent leur travail avant de pouvoir saisir son verrou et continuer. Si vous cherchez uniquement à détecter que le démon C est occupé (c'est-à-dire dans une seule direction), il suffit de tester l'existence d'un fichier de jeton occupé (ou d'un sémaphore ou d'un objet de mémoire partagée). être une meilleure option. Créer des fichiers a tendance à être plus coûteux que de simplement définir un simple drapeau dans la mémoire partagée.

+0

Seulement pour détecter si le démon est occupé. Mais la bonne chose à propos d'un fichier est qu'il est persistant. Je ne suis pas sûr si vous pouvez avoir un sémaphore persistant ou de la mémoire partagée? – lang2

+0

Par persistant, voulez-vous dire entre les redémarrages? Ou à travers le cycle de vie du processus? Pourquoi ne pas simplement faire en sorte que le démon crée une région de mémoire partagée à laquelle tous les clients s'attachent au démarrage. Ils peuvent vérifier le drapeau "occupé" là-bas. – CoreyStup

Questions connexes