我有一个网站,每次用户登录或注销时,我都会将其保存到文本文件中。
如果不存在,我的代码不会附加数据或创建文本文件..这里是示例代码
$myfile = fopen("logs.txt", "wr") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, $txt);
fclose($myfile);
但是在我再打开它之后似乎没有附加到下一行。
也。我认为如果2个用户同时登录会影响打开文本文件并保存之后会出现错误吗?
答案 0 :(得分:280)
尝试这样的事情:
$txt = "user id date";
$myfile = file_put_contents('logs.txt', $txt.PHP_EOL , FILE_APPEND | LOCK_EX);
答案 1 :(得分:89)
使用a
模式。它代表append
。
$myfile = fopen("logs.txt", "a") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, "\n". $txt);
fclose($myfile);
答案 2 :(得分:6)
你可以用OO方式做,只是另一种选择和灵活:
@(title: String, list: List[String])
@import helper._
<!DOCTYPE html>
<html lang="en">
<head>
<title>@title</title>
</head>
<body>
<form action="/test" method="post">
<textarea name="raw_text">
</textarea>
@CSRF.formField
<input type="submit" value="Submit" />
</form>
</body>
</html>
然后像这样使用..让我们说你有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;
}
}
存储在一个会话中(半伪代码):
user_name
用这个检查你的日志:
$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"]);
}
结果如下:
$log->getLog();
答案 3 :(得分:1)
没有这样的文件打开模式&#34; wr&#34;在你的代码中:
fopen("logs.txt", "wr")
PHP http://php.net/manual/en/function.fopen.php中的文件打开模式与C中的相同:http://www.cplusplus.com/reference/cstdio/fopen/
有以下主要开放模式&#34; r&#34;阅读,&#34; w&#34;写作和&#34; a&#34;追加,你不能将它们结合起来。您可以添加其他修饰符,例如&#34; +&#34;更新,&#34; b&#34;对于二进制。新的C标准添加了一个新的标准子规范(&#34; x&#34;),由PHP支持,可以附加到任何&#34; w&#34;说明符(形成&#34; wx&#34;,&#34; wbx&#34;,&#34; w + x&#34;或&#34; w + bx&#34; /&#34; wb + X&#34)。如果文件存在,此子选择器会强制函数失败,而不是覆盖它。
除此之外,在PHP 5.2.6中,&#39; c&#39;主要开放模式被添加。你不能把'c&#39;与&#39;&#39;&#39;&#39;&#39;&#39; w&#39;。 &#39; c&#39;打开文件仅供写入。如果该文件不存在,则创建该文件。如果它存在,它既不会被截断(而不是&#39; w&#39;),也不会对此函数的调用失败(例如&#39; x&#39;)。 &#39; C +&#39;打开文件进行读写;否则它与&#39; c&#39;具有相同的行为。
此外,在PHP 7.1.2中,&#39; e&#39;添加了可与其他模式组合的选项。它在打开的文件描述符上设置了close-on-exec标志。仅适用于在POSIX.1-2008符合系统上编译的PHP。
因此,对于您所描述的任务,最佳文件打开模式将是&#39; a&#39;。它只打开文件进行写入。它将文件指针放在文件的末尾。如果该文件不存在,则会尝试创建该文件。在此模式下,fseek()无效,始终追加写入。
正如上面已经指出的那样,这就是你所需要的:
fopen("logs.txt", "a")
答案 4 :(得分:1)
在Codeigniter 中,您可以使用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);
可以创建此日志并每天附加数据。
答案 5 :(得分:1)
试试这段代码:
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);
}
我总是像这样使用它,它有效...
答案 6 :(得分:0)
尽管有很多方法可以做到这一点。但是,如果您想以一种简单的方式进行操作,并且想要在将其写入日志文件之前格式化文本。您可以为此创建一个辅助函数。
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);
}
}
答案 7 :(得分:0)
这对我很有效,以相同的方式编写(也创建)和/或附加内容。
$fp = fopen("MyFile.txt", "a+")