У меня есть веб-сайт, который при каждом входе в систему или выходе из системы я сохраню в текстовом файле.
мой код не работает при добавлении данных или создает текстовый файл, если он не существует. Вот пример кода
$myfile = fopen("logs.txt", "wr") or die("Unable to open file!"); $txt = "user id date"; fwrite($myfile, $txt); fclose($myfile);
но кажется, что она не добавляется к следующей строке после того, как я снова ее открою.
также. Я думаю, что у него также была бы ошибка в ситуации, например, если бы 2 пользователя входили в одно и то же время, это повлияло бы на открытие текстового файла и сохранение его после?
Попробуйте что-то вроде этого:
$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);
Вы можете сделать это способом OO, просто альтернативным и гибким:
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; } }
Затем используйте его вот так: допустим, у вас есть имя пользователя, хранящееся в сеансе (полу псевдокод):
$log = new Logger("log.txt"); $log->setTimestamp("DM d 'y hi 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 добавляет новый стандартный подтип («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")
$logged_user_id = $this->session->userdata('user_id'); $logged_user_id = isset($logged_user_id)?$logged_user_id:NULL; $insert_log = 'process => '.$process.', details => '.$details.', user_type => '.$user_type.', user_id => '.$logged_user_id.',reg_at => '.date("d/m/Y h:i:sa"); $todate= date('dm-Y'); file_put_contents(APPPATH."assets/logs/".$todate."_log.txt", $insert_log.PHP_EOL , FILE_APPEND | LOCK_EX);