在文本文件中创build或写入/追加

我有一个网站,每次用户login或注销我将其保存到一个文本文件。

我的代码不起作用追加数据或创build一个文本文件,如果不存在..这里是示例代码

$myfile = fopen("logs.txt", "wr") or die("Unable to open file!"); $txt = "user id date"; fwrite($myfile, $txt); fclose($myfile); 

但似乎它不会追加到下一行后,我再次打开它。

也。 我认为这也会有一个错误,如果2个用户同时login会影响打开文本文件并保存之后的情况?

尝试这样的事情:

  $txt = "user id date"; $myfile = file_put_contents('logs.txt', $txt.PHP_EOL , FILE_APPEND | LOCK_EX); 

使用a模式。 它代表append

 $myfile = fopen("logs.txt", "a") or die("Unable to open file!"); $txt = "user id date"; fwrite($myfile, "\n". $txt); fclose($myfile); 

你可以做OO的方式,只是一个替代和灵活的:

 class Logger { private $file, $prefix; public function __construct($filename) { $this->file = $filename; } public function setTimestamp($format) { $this->prefix = date($format)." &raquo; "; } public function putLog($insert) { if (isset($this->prefix)) { file_put_contents($this->file, $this->prefix.$insert."<br>", FILE_APPEND); } else { echo "<script>alert(\"Timestamp is not set yet.\");</script>", die; } } public function getLog() { $content = @file_get_contents($this->file); return $content; } } 

然后像这样使用它。让我们假设你有一个会话(半伪代码)存储的user_name

 $log = new Logger("log.txt"); $log->setTimestamp("DM d 'y hi A"); if (user logs in) { $log->putLog("Successful Login: ".$_SESSION["user_name"]); } if (user logs out) { $log->putLog("Logout: ".$_SESSION["user_name"]); } 

用这个检查你的日志:

 $log->getLog(); 

结果是这样的:

 Sun Jul 02 '17 05.45 PM » Successful Login: JohnDoe Sun Jul 02 '17 05.46 PM » Logout: JohnDoe 

github.com/thielicious/Logger

代码中没有“wr”这样的文件打开模式:

 fopen("logs.txt", "wr") 

PHP中的文件打开模式http://php.net/manual/en/function.fopen.php与C中的相同:; http : //www.cplusplus.com/reference/cstdio/fopen/

有以下主要的开放模式:“r”可读,“w”可写,“a”可以追加,不能合并。 您可以添加其他修饰符,如“+”更新,“b”二进制。 新的C标准增加了一个由PHP支持的新的标准子指定符(“x”),可以附加到任何“w”指定符(形成“wx”,“wbx”,“w + x”或“w + bx “/” WB + X“)。 如果文件存在,这个subspecifier强制函数失败,而不是覆盖它。

除此之外,在PHP 5.2.6中,添加了'c'主打开模式。 你不能把'c'和'a','r','w'结合起来。 'c'打开只写文件。 如果该文件不存在,则会创build该文件。 如果存在,它不会被截断(与'w'相对),也不会调用此函数(与'x'一样)。 'c +'打开文件进行阅读和写作; 否则它具有与'c'相同的行为。

另外,在PHP 7.1.2中添加了“e”选项,可以与其他模式结合使用。 它在打开的文件描述符上设置close-on-exec标志。 只有在POSIX.1-2008符合系统上编译的PHP才可用。

所以,就你所描述的任务而言,最好的文件打开模式是'a'。 它只打开文件以便写入。 它将文件指针放在文件的末尾。 如果该文件不存在,则尝试创build该文件。 在这种模式下,fseek()不起作用,写入总是被附加的。

正如上面已经指出的,这是你需要的东西:

 fopen("logs.txt", "a") 
 $logged_user_id = $this->session->userdata('user_id'); $logged_user_id = isset($logged_user_id)?$logged_user_id:NULL; $insert_log = 'process => '.$process.', details => '.$details.', user_type => '.$user_type.', user_id => '.$logged_user_id.',reg_at => '.date("d/m/Y h:i:sa"); $todate= date('dm-Y'); file_put_contents(APPPATH."assets/logs/".$todate."_log.txt", $insert_log.PHP_EOL , FILE_APPEND | LOCK_EX);