Synchronisé fonctions en PHP
Est-il un moyen de faire de fonctions en PHP synchronisé pour s'assurer que deux ou plusieurs internautes ne pouvez pas exécuter la même fonction dans le même temps?
Je pense que vous avez besoin de fournir un peu plus d'informations ici. Est la fonction que vous essayez d'exécuter pas thread-safe?
Ce thread est un peu vieux mais je pense que c'est une assez bonne réponse: Stackoverflow
Ce thread est un peu vieux mais je pense que c'est une assez bonne réponse: Stackoverflow
OriginalL'auteur Chris | 2010-12-28
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pourriez obtenir le même(si disponible) à l'aide de sem_acquire d'acquérir un sémaphore (à l'entrée de crital section) et sem_release pour libérer le verrou.
Je suppose que c'est vrai.
OriginalL'auteur Alfred
Vous pouvez utiliser le verrouillage externe - par exemple, le verrouillage de fichier via troupeau. Créer un fichier quelque part et script pour le verrouiller. Vous pouvez également utiliser les sémaphores, mais ceux-ci sont uniquement pour Unix.
OriginalL'auteur StasM
Je ne peux pas penser à tout problème que vous pourriez être confronté. Cependant, une fois, j'ai dû écrire un script PHP qui était en train de faire certains calculs complexes et j'ai dû faire en sorte qu'il n'a pas été exécuté simultanément par deux utilisateurs. Pour la réaliser, j'ai créé un fichier vide sur le début du script et l'a supprimé lorsque les calculs ont été achevés. Bien sûr, le script vérifie si le fichier existe avant de commencer les calculs.
Je suis toujours à droite, Lucasz. 🙂
considérez ceci: prcess 1 cecks j'ai le fichier existe et n'existe pas. Puis proccess ceux timesclice se termine et il est procédé à deux tour, il vérifie si te ile existe, et puisqu'effectuer les deux n'a pas encore créé il.les deux proccesses wil exécuter à la sametime! Votre solution réduit le risque, mais il ne l'élimine pas. Vous avez donc avantage à utiliser sem_aquire comme Alfred suggéré.
A.: Veuillez garder à l'esprit que je ne l'ai décrit la solution utilisée par moi certains depuis longtemps. Je n'ai pas dit que c'est le meilleur.
Baran. Je n'ai jamais voulu d'attaque/de vous insulter. Je voulais juste faire remarquer que ce n'est pas que de la sauvegarder comme il peut sembler.
OriginalL'auteur Lukasz
Noter que les locaux de verrouillage de fichiers et les sémaphores ne fonctionne que si vous avez un serveur web. Si votre script est hébergé par plusieurs serveurs à charge équilibrée, vous aurez à trouver un autre mécanisme de verrouillage, par exemple spécialisé "verrouillage serveur" sur une machine ou une sorte de verrouillage de fichiers via NFS.
OriginalL'auteur Emil Vikström
Un peu plus de détails sur pourquoi vous avez besoin de la serrure, ce serait bien. Si vous rencontrez des problèmes avec les utilisateurs de la base de données d'interactions casser les uns les autres, vous devriez être à la recherche à l'aide de transactions dans votre base de données de code de sorte que des changements complexes sont traitées automatiquement par la base de données.
Comme un exemple: j'utilise Symfony avec l'ORM Doctrine, de sorte que mon commit code ressemble généralement à ceci:
Maintenant, cela ne devrait pas empêcher des utilisateurs de se casser les uns les autres, si ils arrivent à être modifiez l'enregistrement dans le même temps, cependant, il sera assurez-vous que la base de données reste cohérent-qui est, soit de l'Utilisateur des modifications prennent effet ou de l'utilisateur B modifications prennent effet, mais jamais un méli-mélo de l'Utilisateur A et Utilisateur B en fonction des changements de l'humeur de la DB.
OriginalL'auteur Nathan Strong
Dans le passé, j'ai créé des serrures simples sur des enregistrements dans la base de données. Si vous êtes à la transformation d'un enregistrement existant, vous pouvez stocker son type, id, et le temps de la serrure. Assurez-vous que le type et id sont la clé de la table de base de données (ou de la mémoire cache). Lorsque vous démarrez le processus, vous pouvez acquérir le verrou d'une manière qui ne sera pas effacer un verrouillage existant. Si il y a l'expiration d'un verrou, d'en prendre. S'il existe déjà un verrou qui n'a pas expiré, ne parviennent pas à démarrer le processus (de la file d'attente ou de retour). Si il n'y avait pas de serrure, ou il était déjà expiré de verrouillage, vous êtes de l'or. Vous avez maintenant la serrure. Lorsque vous avez terminé, relâcher le verrou.
Vous pouvez lier ce genre de système pour les dossiers déjà dans votre base de données, créer de nouvelles tables pour les travaux en cours, ou même utiliser un cache externe.
OriginalL'auteur TheJacobTaylor