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

Jer*_*che 157 php

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

我的代码在附加数据时不起作用,或者如果不存在则创建文本文件.这里是示例代码

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

但是在我再次打开之后,它似乎不会附加到下一行.

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

Spe*_*erX 307

尝试这样的事情:

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

  • http://php.net/manual/en/function.file-put-contents.php此函数返回写入文件的字节数,如果失败则返回FALSE.如果有人想知道的话. (9认同)
  • 这会创建一个文本文件,如果它不存在? (5认同)
  • 我有个问题.使用LOCK_EX.我知道这会阻止其他人同时写入该文件.但另一个会发生什么? (5认同)
  • 是的,它创建文本文件`logs.txt`并在其中附加内容 (4认同)
  • @JerahmeelAcebuche尝试获取锁的第二个进程"将阻塞,直到获取所请求的锁"([source](http://php.net/manual/en/function.flock.php)).换句话说,第二个进程将等到第一个进程关闭文件并释放锁定. (3认同)

Val*_*ier 98

使用a模式.它代表着append.

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


Thi*_*ous 7

你可以用OO的方式做到这一点,只是一种替代性和灵活性:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用..让我们说你已经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"]);
}
Run Code Online (Sandbox Code Playgroud)

用这个检查你的日志:

$log->getLog();
Run Code Online (Sandbox Code Playgroud)

结果如下:

Sun Jul 02 '17 05.45 PM » Successful Login: JohnDoe
Sun Jul 02 '17 05.46 PM » Logout: JohnDoe
Run Code Online (Sandbox Code Playgroud)


github.com/thielicious/Logger

  • 非常感谢这个 Logger 课程!当我找到这个页面时,我没想到会发现……但它实际上是一个比我最初计划实施的更好的解决方案的基础。 (2认同)

Mih*_*att 6

这对我有用,写作(也创造)和/或以相同的模式附加内容。

$fp = fopen("MyFile.txt", "a+") 
Run Code Online (Sandbox Code Playgroud)


PHP*_*... 5

尽管有很多方法可以做到这一点。但是,如果您想以简单的方式完成此操作,并希望在将文本写入日志文件之前对其进行格式化。您可以为此创建一个辅助函数。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)