sourcecode

텍스트 파일에 작성 또는 쓰기/추가

copyscript 2022. 9. 23. 00:06
반응형

텍스트 파일에 작성 또는 쓰기/추가

사용자가 로그인하거나 로그아웃할 때마다 텍스트 파일에 저장하는 웹 사이트가 있습니다.

데이터 추가 또는 텍스트 파일 생성 시 코드가 작동하지 않습니다.여기 샘플 코드가 있습니다.

$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모드(mode).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,
        $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

같은 모드로 콘텐츠를 작성(작성)하거나 추가하거나 둘 다 사용할 수 있습니다.

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

다음 코드를 사용해 보십시오.

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

항상 이렇게 쓰는데 잘 되더라고요.

여러 가지 방법이 있긴 하지만요.그러나 로그 파일에 쓰기 전에 텍스트 형식을 지정하고 싶은 경우.이를 위한 도우미 기능을 만들 수 있습니다.

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

코드에는 "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 표준은 PHP에 의해 지원되는 새로운 표준 하위 지정자("x")를 추가하며, 이는 "wx", "wbx", "w+x" 또는 "w+bx"/"wb+x"를 형성하기 위해 "w" 지정자에 추가할 수 있습니다.이 하위 지정자는 파일이 존재하는 경우 덮어쓰기가 아니라 강제로 기능이 실패하도록 합니다.

그 외에도 PHP 5.2.6에서는 'c' 메인 오픈 모드가 추가되었습니다.c는 a, r, w와 조합할 수 없습니다.c'는 파일을 쓰기 전용으로 엽니다.파일이 존재하지 않으면 생성됩니다.이 함수가 존재하는 경우, ('w'가 아닌) 잘리지 않거나 ('x'의 경우와 같이) 이 함수에 대한 호출이 실패하지 않습니다.'c+' 파일을 읽고 쓸 수 있도록 엽니다. 그렇지 않으면 'c'와 같은 동작을 합니다.

또한 PHP 7.1.2에서는 다른 모드와 조합할 수 있는 'e' 옵션이 추가되었습니다.열려 있는 파일 기술자에 close-on-exec 플래그를 설정합니다.POSIX.1-2008 적합 시스템에서 컴파일된 PHP에서만 사용할 수 있습니다.

따라서 설명한 대로 최적의 파일 열기 모드는 'a'입니다.파일을 쓰기 전용으로 엽니다.파일 포인터가 파일 끝에 배치됩니다.파일이 존재하지 않는 경우는, 작성하려고 합니다.이 모드에서는 fseek()는 효과가 없습니다.기입은 항상 추가됩니다.

위에서 이미 지적한 바와 같이 필요한 것은 다음과 같습니다.

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

언급URL : https://stackoverflow.com/questions/24972424/create-or-write-append-in-text-file

반응형