Je suis surtout familier avec Java, C et C++ dans lesquels il existe des moyens de contrôler qu'un seul thread accède à une ressource à un moment donné. Maintenant, je suis à la recherche de quelque chose de similaire, mais en PHP 5.x.Accès au fichier synchronisé PHP 5.x (pas de base de données)
Pour formuler mon problème avec un exemple:
J'ai un fichier ASCII qui stocke un nombre, la valeur d'un compteur de chargement de la page. Au déploiement de l'application, le fichier contiendra simplement un 0. Pour chaque accès, la valeur sera incrémentée de un. L'objectif est de garder une trace des charges de la page.
Le problème survient lorsque de nombreux utilisateurs accèdent simultanément à la page contenant le compteur. Lorsque le thread A a lu la valeur actuelle, disons qu'il est 11, un autre thread que nous appelons B lit la valeur, toujours 11. Ensuite, le premier thread A incrémente la valeur lue et écrit 12 dans le fichier et le ferme. Ensuite, le deuxième thread B, incrémente la valeur lue, qui était de 11, obtient 12 et écrit cela dans le fichier. La valeur 12 est stockée dans le fichier, alors que cela aurait vraiment dû être 13.
Dans un autre langage de programmation, je l'aurais résolu en utilisant un mutex. Je comprends qu'il y a des mutex, de la mémoire partagée et d'autres fonctionnalités dans le cadre de modules. Mais je voudrais une solution qui fonctionne sur "la plupart des serveurs" là-bas. Plate-forme indépendante. Installé sur la plupart des hébergeurs web bon marché. Y a-t-il une bonne solution à ce problème? Et s'il n'y en a pas, de quelle façon prendriez-vous si vous utilisez une base de données n'est pas une option?
Réponse informative avec une solution à l'exemple de problème, merci! Je pense qu'appeler flock ($ fp, LOCK_UN) est sympa même si fclose ($ fp) libère aussi le verrou. J'ai une question cependant, pourquoi ajoutez-vous les espaces avant le saut de ligne dans fwrite ($ fp, $ cntr. "\ N")? –
Oops, c'était un reste de mon développement original. J'allais juste utiliser fseek sans le ftruncate. Ajoutant les espaces, garantit qu'il efface tous les autres caractères qui étaient sur la ligne (plus important pour la décrémentation.) Edité ci-dessus, car il n'est plus nécessaire. – terson