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


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

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

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

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

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

6 108
php

6 ответов:

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

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

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

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

вы можете сделать это ОО способ, просто альтернативный и гибкий:

class Logger {

    private
        $file,
        $prefix;

    public function __construct($filename) {
        $this->file = $filename;
    }

    public function setTimestamp($format) {
        $this->prefix = date($format)." » ";
    }

    public function putLog($insert) {
        if (isset($this->prefix)) {
            file_put_contents($this->file, $this->prefix.$insert."<br>", FILE_APPEND);
        } else {
            echo "<script>alert(\"Timestamp is not set yet.\");</script>", die;
        }
    }

    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

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

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

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

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

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

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

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

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

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

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

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