Создание или запись/добавление в текстовый файл

У меня есть веб-сайт, который при каждом входе в систему или выходе из системы я сохраню его в текстовом файле.

мой код не работает при добавлении данных или создает текстовый файл, если его не существует.. вот пример кода

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

но кажется, что он не добавляется к следующей строке после того, как я снова открою его.

также. Я думаю, что у него также была бы ошибка в ситуации, например, если бы 2 пользователя входили в одно и то же время, это повлияло бы на открытие текстового файла и сохранение его после?

Ответ 1

Попробуйте что-то вроде этого:

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

Ответ 2

Используйте режим a. Это означает append.

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

Ответ 3

Вы можете сделать это 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;
    }

}

Затем используйте это так.. пусть говорят, вы 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();

Результат похож на:

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


github.com/thielicious/Logger

Ответ 4

В вашем коде нет такого открытого режима файла, как "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 добавляет новый стандартный подтип ( "x" ), поддерживаемый PHP, который может быть добавлен к любому спецификатору "w" (для формирования "wx", "wbx", "w + x" или "w + bx" / "WB + х" ). Этот подтип заставляет функцию сбой, если файл существует, а не перезаписывать его.

Кроме того, в PHP 5.2.6 был добавлен основной режим "c". Вы не можете комбинировать 'c' с 'a', 'r', 'w'. "C" открывает файл только для записи. Если файл не существует, он создается. Если он существует, он не усекается (в отличие от "w" ), и вызов этой функции не выполняется (как в случае с "x" ). 'c +' Откройте файл для чтения и записи; в противном случае он имеет такое же поведение, как и "c".

Кроме того, в PHP 7.1.2 добавлена ​​опция 'e', ​​которая может быть объединена с другими режимами. Он устанавливает флаг close-on-exec в открывшемся дескрипторе файла. Доступно только в PHP, составленном на основе совместимых систем POSIX.1-2008.

Итак, для задачи, как вы ее описали, лучшим режимом открытого файла будет "a". Он открывает файл только для записи. Он помещает указатель файла в конец файла. Если файл не существует, он пытается его создать. В этом режиме fseek() не действует, записи всегда добавляются.

Вот что вам нужно, как уже указывалось выше:

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

Ответ 5

В 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);

Этот журнал можно создавать и добавлять данные ежедневно.

Ответ 6

Попробуйте этот код:

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

Я всегда так использую, и это работает...

Ответ 7

Хотя есть много способов сделать это. Но если вы хотите сделать это простым способом и хотите отформатировать текст перед записью в файл журнала. Вы можете создать вспомогательную функцию для этого.

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

Ответ 8

Это работает для меня, написание (создание также) и/или добавление контента в том же режиме.

$fp = fopen("MyFile.txt", "a+")