Salut,
J'écrit actuellement un script de gestion de log, et en fait j'ai un petit souci avec les acces concurrent.
Mes logs sont écrit dans un fichier partagé par tout les scripts executé à un moment T.
Pour pouvoir gérer les acces concurrents j'ai trouvé la fonction flock sur php.net.
Seulement voila, après quelques test sur deux thread simultanés... bah ce n'est pas très concluant...
Bref, l'avez vous déja utilisé avec succès ? Ou avez vous utilisé une sauce maison ?
Pour info, voici ce que me donne certaines ligne de log ..
Cette séquence la 5";} réprésente la fin d'une autre ligne de log et ne devraient pas exister...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 O:7:"MesLogs":2:{s:14:" MesLogs date_";s:12:"Im process 2";s:17:" MesLogs message_";s:33:"===============================14";} 5";} O:7:"MesLogs":2:{s:14:" MesLogs date_";s:12:"Im process 1";s:17:" MesLogs message_";s:39:"-----------------------------------1526";}
Autre exemple :
Ici il manque le début d'une ligne de log...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 O:7:"MesLogs":2:{s:14:" MesLogs date_";s:12:"Im process 2";s:17:" MesLogs message_";s:34:"===============================385";} O:7:"MesLogs":2:{s:14:" MesLogs date_";s:12:"Im process 1";s:17:" MesLogs message_";s:39:"-----------------------------------5096";} MesLogs":2:{s:14:" MesLogs date_";s:12:"Im process 2";s:17:" MesLogs message_";s:34:"===============================387";} O:7:"MesLogs":2:{s:14:" MesLogs date_";s:12:"Im process 2";s:17:" MesLogs message_";s:34:"===============================388";}
Et surtout ce problème semble apparaître 40 fois sur 21 000 écritures... Cela représente pas mal de ratage de tout même.
Sans compter que ces écritures non finies pourrissent mon système puisqu'elles me rajoutent des lignes qui ne devraient pas exister..
Pour verrouiller l'accès j'utilise ce code, peut etre que je ne le fais pas correctement.
Si vous avez la moindre solution n'hésitez surtout pas car la je n'en vois pas à part passer par un sgbd...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 /* Ajoute une ligne dans le fichier de log courant */ public function AddLine ( LogLine $Line ) { /* ouverture du fichier */ if( ! @$handle = fopen($this->Path."/".$this->SelectLastLogFile(), "ab") ) { throw new Exception ( "Impossible d'ouvrir le fichier en écriture !" ); } /* Ajout d'un verrou exclusif en ecriture/lecture */ while ( false === (flock($handle, LOCK_SH+LOCK_EX)) ) { usleep (1); } /* écriture de la ligne, ou lancement d'une exception */ if ( fwrite($handle, LogLine::__serialize( $Line )) === FALSE) { throw new Exception ( "Impossible d'écrire dans le fichier !" ); } /* Libération du verrou en lecture/écriture */ flock($handle, LOCK_UN); /* fermeture du pointeur sur le fichier */ fclose($handle); }
Merci,
bye
Partager