Que se passe-t-il lorsque de nombreuses demandes sont reçues pour lire et écrire dans un fichier en PHP? Les demandes deviennent-elles la queue? Ou est seulement accepté et le reste est jeté? P>
Je prévois d'utiliser un compteur de coup basé sur le texte. P>
3 Réponses :
Vous pouvez rencontrer le problème de la condition de race
Pour éviter cela si vous n'avez besoin que de simples données d'appends, vous pouvez utiliser P> et ne vous inquiétez pas de vos données. intégrité. p> Si vous avez besoin d'une opération plus complexe, vous pouvez utiliser FLOCK (utilisé pour Problème simple lecteur / écrivain) p> pour votre compteur de script PHP, je vous suggère de faire quelque chose comme ceci: P> //> Register this impression
file_put_contents( $file, '1', FILE_APPEND|LOCK_EX );
//> Read the total number of impression
echo filesize($file);
Ouais, je sais que vous pouvez verrouiller un fichier pour le fonctionnement R / W, mais si vous avez ensuite été reçue à la lecture ou à l'écriture de la demande ou de faire la queue?
avec file_append en file d'attente. De plus, il n'y a pas de blocage de demande de lecture si vous utilisez ce fichier_append | LOCK_EX
"Avec file_append en file d'attente" Qu'est-ce que cela signifie? Vous voulez dire que si j'ouvre le fichier en mode APPEND?
Avec fichier_append les demandes d'écriture sont la file d'attente bien sûr. Pendant ce temps, les demandes de lecture ne sont pas bloquées.
Peut-être qu'il ne veut pas Ajouter i> seulement. Avec une serrure en écriture, vous pouvez effectuer n'importe quelle modification que vous souhaitez sur le fichier, les autres threads seront Filed i> (non lancés) jusqu'à ce que le verrouillage soit libéré.
@Morel: J'ai écrit spécifiquement, il peut utiliser File_Put_Contents s'il a besoin de données simples append :). S'il a besoin d'une opération plus complexe, il ne peut pas utiliser ça
C'est quelque chose de nouveau pour moi, en comptant les coups de fichiers, mais que se passe-t-il si mon site devient Facebook? MDR :)
@sourav: Si cela devient Facebook peut-être que vous commencerez à utiliser quelque chose comme Google Analytics ^^
Comme je l'ai vu, Lock_ex code> ne fonctionne pas sans append, non?
Vous pouvez utiliser FLOCK () pour obtenir un verrou sur le fichier avant lire / écrire à elle. Si d'autres threads détiennent une serrure sur le fichier, FLOCK () code> attendra que les autres serrures sont libérées. P>
Corrigez-moi si je me trompe, mais Flock ne vous garantira pas l'exclusivité de la serrure, quand il y a 3 écrivains à la fois ... ce qui peut arriver (et s'est passé plusieurs fois dans mes cas) dans un environnement multithread, tel que Apache ( En mode Fork ou en mode multithread, peu importe), FCGI, peu importe ... Demande n ° 1: FLOCK (); fwrite (); .. # 2 attend la serrure, la follier ... # 3 attend aussi pour la serrure, en même temps. fwrite ... bam, # 2 et # 3 écrit en même temps ... ai-je raison?
Dans ma compréhension, FLOCK () code> fonctionne au niveau du système d'exploitation et devrait être du thread-coffre-fort. Peut-être que quelqu'un avec une meilleure connaissance du système d'exploitation peut confirmer cela?
Non, les demandes ne seront pas en file d'attente, le lecteur obtiendra des données endommagées, les écrivains écraseront mutuellement. Les données seront endommagées. P>
Vous pouvez essayer d'utiliser flock et x code > Mode de fopen .
Il n'est pas si facile de coder un bon verrouillage Mutex, alors essayez de trouver la variante existante ou d'essayer de déplacer les données du fichier à dB. P>
Avez-vous une source pour cette information? Semble contredire d'autres réponses ici, je me demandais donc comment vous le savez.
@OZ_, voulez-vous dire C code> au lieu de x code> drapeau?
Jetez un coup d'œil à ma réponse sur FLOCK Utilisation: Voici . Pourrait être utile.