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

时间:2014-07-26 15:11:16

标签: php

我有一个网站,每次用户登录或注销时,我都会将其保存到文本文件中。

如果不存在,我的代码不会附加数据或创建文本文件..这里是示例代码

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

但是在我再打开它之后似乎没有附加到下一行。

也。我认为如果2个用户同时登录会影响打开文本文件并保存之后会出现错误吗?

8 个答案:

答案 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)." &raquo; "; } 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();


github.com/thielicious/Logger

答案 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+")