Вопрос:

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

php

225317 просмотра

7 ответа

724 Репутация автора

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

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

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

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

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

Автор: Jerahmeel Acebuche Источник Размещён: 26.07.2014 03:11

Ответы (7)


283 плюса

3735 Репутация автора

Решение

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

 $txt = "user id date";
 $myfile = file_put_contents('logs.txt', $txt.PHP_EOL , FILE_APPEND | LOCK_EX);
Автор: SpencerX Размещён: 26.07.2014 03:13

90 плюса

4505 Репутация автора

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

$myfile = fopen("logs.txt", "a") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, "\n". $txt);
fclose($myfile);
Автор: Valentin Mercier Размещён: 26.07.2014 03:13

1 плюс

1569 Репутация автора

В вашем коде нет такого режима открытия файлов, как "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». «С» открывает файл только для записи. Если файл не существует, он создается. Если он существует, он не усекается (в отличие от 'w'), и вызов этой функции не выполняется (как в случае с 'x'). 'c +' Открыть файл для чтения и записи; в противном случае он ведет себя так же, как «с».

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

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

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

fopen("logs.txt", "a") 
Автор: Maxim Masiutin Размещён: 22.04.2017 04:23

7 плюса

2208 Репутация автора

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

Автор: Thielicious Размещён: 02.07.2017 03:49

1 плюс

316 Репутация автора

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

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

Автор: Anandan K Размещён: 10.11.2017 06:41

1 плюс

41 Репутация автора

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

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

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

Автор: Rwakos Размещён: 20.03.2018 10:36

0 плюса

3536 Репутация автора

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

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);
    }
}
Автор: PHP Worm... Размещён: 13.06.2019 05:11
Вопросы из категории :
32x32