J'ai un site Web qui, chaque fois qu'un utilisateur se connecte ou se déconnecte, l'enregistre dans un fichier texte.
Mon code ne fonctionne pas lors de l'ajout de données ou de la création d'un fichier texte s'il n'existe pas. Voici l'exemple de code
$myfile = fopen("logs.txt", "wr") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, $txt);
fclose($myfile);
Il semble que cela ne soit pas ajouté à la ligne suivante après que je l'ouvre à nouveau.
De plus, je pense que cela provoquerait également une erreur dans une situation où deux utilisateurs se connectent en même temps, cela affecterait-il l'ouverture du fichier texte et sa sauvegarde par la suite?
Essayez quelque chose comme ça:
$txt = "user id date";
$myfile = file_put_contents('logs.txt', $txt.PHP_EOL , FILE_APPEND | LOCK_EX);
Utilisez le mode a
. Il représente append
.
$myfile = fopen("logs.txt", "a") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, "\n". $txt);
fclose($myfile);
Vous pouvez le faire de la manière OO, juste une alternative et flexible:
class Logger {
private
$file,
$timestamp;
public function __construct($filename) {
$this->file = $filename;
}
public function setTimestamp($format) {
$this->timestamp = date($format)." » ";
}
public function putLog($insert) {
if (isset($this->timestamp)) {
file_put_contents($this->file, $this->timestamp.$insert."<br>", FILE_APPEND);
} else {
trigger_error("Timestamp not set", E_USER_ERROR);
}
}
public function getLog() {
$content = @file_get_contents($this->file);
return $content;
}
}
Ensuite, utilisez-le comme ceci. Supposons que user_name
soit stocké dans une session (semi-pseudo-code):
$log = new Logger("log.txt");
$log->setTimestamp("D M d 'y h.i A");
if (user logs in) {
$log->putLog("Successful Login: ".$_SESSION["user_name"]);
}
if (user logs out) {
$log->putLog("Logout: ".$_SESSION["user_name"]);
}
Vérifiez votre journal avec ceci:
$log->getLog();
Le résultat est comme:
Sun Jul 02 '17 05.45 PM » Successful Login: JohnDoe
Sun Jul 02 '17 05.46 PM » Logout: JohnDoe
Il n’existe pas de mode d’ouverture de fichier tel que "wr" dans votre code:
fopen("logs.txt", "wr")
Le mode d’ouverture du fichier dans PHP http://php.net/manual/en/function.fopen.php est identique à celui de C: http://www.cplusplus.com/reference/cstdio/fopen/
Il existe les principaux modes d'ouverture suivants: "r" pour lecture, "w" pour écriture et "a" pour ajout, et vous ne pouvez pas les combiner. Vous pouvez ajouter d'autres modificateurs tels que "+" pour la mise à jour, "b" pour le binaire. La nouvelle norme C ajoute un nouveau sous-spécificateur standard ("x"), pris en charge par PHP, qui peut être ajouté à tout spécificateur "w" (pour former "wx", "wbx", "w + x" ou "w + bx "/" wb + x "). Cette sous-spécification force la fonction à échouer si le fichier existe, au lieu de l'écraser.
En plus de cela, dans PHP 5.2.6, le mode d'ouverture principal 'c' a été ajouté. Vous ne pouvez pas combiner "c" avec "a", "r", "w". Le 'c' ouvre le fichier en écriture uniquement. Si le fichier n'existe pas, il est créé. Si elle existe, elle n'est ni tronquée (contrairement à "w"), ni l'appel à cette fonction échoue (comme c'est le cas avec "x"). 'c +' Ouvre le fichier en lecture et en écriture. sinon, il a le même comportement que "c".
De plus, et dans PHP 7.1.2, l'option 'e' a été ajoutée et peut être combinée avec d'autres modes. Il positionne l'indicateur Close-on-Exec sur le descripteur de fichier ouvert. Uniquement disponible dans PHP compilé sur des systèmes conformes à POSIX.1-2008.
Ainsi, pour la tâche telle que vous l'avez décrite, le meilleur mode d'ouverture de fichier serait "a". Il ouvre le fichier en écriture uniquement. Il place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, il tente de le créer. Dans ce mode, fseek () n'a aucun effet, les écritures sont toujours ajoutées.
Voici ce dont vous avez besoin, comme cela a déjà été souligné ci-dessus:
fopen("logs.txt", "a")
Essayez ce code:
function logErr($data){
$logPath = __DIR__. "/../logs/logs.txt";
$mode = (!file_exists($logPath)) ? 'w':'a';
$logfile = fopen($logPath, $mode);
fwrite($logfile, "\r\n". $data);
fclose($logfile);
}
Je l'utilise toujours comme ça, et ça marche ...
Cela fonctionne pour moi, écrivant (créant également) et/ou ajoutant du contenu dans le même mode.
$fp = fopen("MyFile.txt", "a+")
Bien qu'il y ait plusieurs façons de le faire. Mais si vous voulez le faire facilement et que vous souhaitez formater le texte avant de l'écrire dans le fichier journal. Vous pouvez créer une fonction d'assistance pour cela.
if (!function_exists('logIt')) {
function logIt($logMe)
{
$logFilePath = storage_path('logs/cron.log.'.date('Y-m-d').'.log');
$cronLogFile = fopen($logFilePath, "a");
fwrite($cronLogFile, date('Y-m-d H:i:s'). ' : ' .$logMe. PHP_EOL);
fclose($cronLogFile);
}
}
Dans Codeigniter vous pouvez utiliser la méthode FILE_APPEND
$logged_user_id = $this->session->userdata('user_id');
$insert_log = 'process => 'YOUR PROCESS STATUS TO LOG', user_id => '.$logged_user_id.',reg_at => '.date("d/m/Y h:i:sa");
$Dt = date('d-m-Y');
file_put_contents(APPPATH."assets/logs/".$Dt."_log.txt", $insert_log.PHP_EOL , FILE_APPEND | LOCK_EX);
Ce journal peut être créé et ajouter des données quotidiennement.