テキストファイルの作成または書き込み/追加


170

ユーザーがログインまたはログアウトするたびにテキストファイルに保存するWebサイトがあります。

データが存在しない場合、データの追加やテキストファイルの作成でコードが機能しません。ここにサンプルコードがあります。

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

もう一度開いた後、次の行に追加されないようです。

また、2人のユーザーが同時にログインした場合にもエラーが発生すると思います。テキストファイルを開いて後で保存するときに影響がありますか?

回答:


337

このようなものを試してください:

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

5
存在しない場合、これはテキストファイルを作成しますか?
Jerahmeel Acebuche 2014

5
そう、テキストファイルlogs.txtを作成し、その中にコンテンツを追加します
SpencerX '26 / 07/26

5
質問があります。LOCK_EXを使用します。これにより、他のユーザーが同時にファイルに書き込むことができなくなります。しかし、別のものはどうなりますか?
Jerahmeel Acebuche 2014

13
php.net/manual/en/function.file-put-contents.phpこの関数は、ファイルに書き込まれたバイト数を返します。失敗した場合はFALSEを返します。誰かが不思議に思っている場合でも。
マスタージェームズ

7
@JerahmeelAcebucheロックを取得しようとする2番目のプロセスは、「要求されたロックが取得されるまでブロックされます」(ソース)。つまり、2番目のプロセスは、最初のプロセスがファイルを閉じてロックを解放するまで待機します。
rinogo

102

aモードを使用します。それはの略ですappend

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

この問題も\ nあります。それは動作しません。それはあなたに役立ちますか?
Jerahmeel Acebuche 2014

1
私が言ったように状況が発生した場合、これは機能しますか?
Jerahmeel Acebuche 2014

1
aそれは存在しませんし、何あなたは本当にいることを確認して何も問題になる場合にはフラグは、ファイルが作成されますappend新しいテキスト。それは機能\nしますが、二重引用符の内側が一重引用符では"ない場合に限られます'
Valentin Mercier

2人のユーザーが異なるブラウザーでログインした場合の状況を意味します。次に、phpは2つのブラウザーで同時にファイルを開き、同時に更新します。問題はありますか?\
Jerahmeel Acebuche '26 / 07/26

1
ああ、そうです、この場合はSQLデータベースを使用します。これには、競合状態を回避するための組み込みエンジンがあります。しかし、それはまったく新しい質問です。
Valentin Mercier 2014

10

あなたはそれをオブジェクト指向の方法で行うことができますが、これは代替手段であり、柔軟性があります:

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


1
このLoggerクラスに感謝します!このページを見つけたとき、それを見つけるとは思っていませんでした...しかし、それは実際に、私が最初に実装することを計画していたものよりもはるかに優れたソリューションの基礎です。
Myke Carter

4

これは私のために働いています、同じモードでライティング(作成も)そして/またはコンテンツを追加します。

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

3

このコードを試してください:

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

私はいつもこのように使っています、そしてそれはうまくいきます...


1
実行する理由はありません。ファイルが存在しない場合、(!file_exists($logPath)) ? 'w':'a'このaオプションはすでに正しい動作をしています。したがって$mode = ...;、行を削除し、次の行をに変更することで、この回答を簡略化でき$logfile = fopen($logPath, 'a');ます。
ToolmakerSteve

2

コードに「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")を追加します。これは、任意の "w"指定子に追加できます( "wx"、 "wbx"、 "w + x"または "w + bxの形式に"/" wb + x ")。このサブ指定子は、ファイルが存在する場合、ファイルを上書きするのではなく、強制的に関数を失敗させます。

さらに、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") 

0

これを行うには多くの方法がありますが。しかし、簡単な方法で行いたい場合や、ログファイルに書き込む前にテキストをフォーマットしたい場合は、このためのヘルパー関数を作成できます。

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);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.