
No.2ベストアンサー
- 回答日時:
その後、「w」モードでのflock関数の使い方について心配でしたので、調べてみたら、
「w」モードでflockが聞かないことがわかりましたので、書きなおしました。
<?php
$new_line = 'これが新しい行'."\r\n";
//ファイルを全て読み出し
$data = file('log.csv'); //file関数は改行ごとに配列に分解して取得出来ます。
$data[] = $new_line; //配列に新しい行を追加
$lines = count($data); //現在の行数を取得
//まず指定行数以上達しているのかどうかを判別
if($lines >= 20){ //指定行が100件だとして、それ以上存在するなら、一番古いもの(配列の一番先頭)を削除
unset($data[0]);
}
//全部の行をファイルに書き込み
$fp = fopen('log.csv', 'a+');
if(flock($fp, LOCK_EX)){
ftruncate($fp, 0); //ファイルを0バイトにする
foreach($data as $datum){
fwrite($fp, $datum);
}
}else{
echo "ファイルをロックできません。";
}
fclose($fp);
?>
また、参考にさせていただいたサイトを貼りつけておきます。
失礼しました。
参考URL:http://www.programming-magic.com/20080211020413/
お返事ありがとうございます。
丁寧にソースまでつけて頂き大変わかりやすく、助かりました。
データベースについても難しそうですが今後勉強していこうと考えております。
ありがとうございましたm(_ _)m
No.3
- 回答日時:
もしそれが本当に「ログファイル」であれば、一行追加しながら一行削除する
というのは無駄なので現実的ではありません。
ログファイルというのはローテートして使用するものです。
syslogdなどでサイズや期間を指定してまわしてください。
お返事ありがとうございます。
「削除せずに残す」というやり方もあるのですね。
現在はWEBチャットを作成中でそのログが過去に遡って蓄積されていくのはあまり気持ちよく無いので1行毎に削除するという形が良いかななどと思ったのですが、例えば掲示板やアクセスログなどの場合には「ログには残す」形で「出力しない」という方法を取るのが良いかもしれないと思いました。
まだやり方などが想像つかないので先の課題になりそうですが・・・。
ありがとうございましたm(_ _)m
No.1
- 回答日時:
基本的にfopen関数などでファイルを開く場合、指定行数を削除するとか、そういうことは出来ないと思います。
なので、一度全部の行を取得した後に、指定行数分のみ上書きで書き込む、という方法になると思います。
<?php
$new_line = 'これが新しい行'."\r\n";
//ファイルを全て読み出し
$data = file('log.csv'); //file関数は改行ごとに配列に分解して取得出来ます。
$data[] = $new_line; //配列に新しい行を追加
$lines = count($data); //現在の行数を取得
//まず指定行数以上達しているのかどうかを判別
if($lines >= 100){ //指定行が100件だとして、それ以上存在するなら、一番古いもの(配列の一番先頭)を削除
unset($data[0]);
}
//全部の行をファイルに書き込み
$fp = fopen('log.csv', "w");
flock($fp, LOCK_EX); //ファイルを排他ロック
foreach($data as $datum){ //配列を一行ずつ展開して
fwrite($fp, $datum); //書き込み
}
fclose($fp); //ファイルを閉じる
?>
といった感じで、一応は実装出来ます。
ただし、
・全てのデータを取得して配列に落としている
・「w」モードでファイルを開いているので、ファイルのロックに失敗したとか、何らかの原因で全データがなくなったり破損したりするかもしれないので別の処理をかく必要もあるかもしれない。
・古い行意外にも途中の要らない行を削除するなどする場合はまた別のそれなりに面倒な記述が必要になる。
と、処理が重かったり、ある程度リスクがあったりするので、
ただファイルを記録するよりかは、何らかのデータベースをご利用された方が良いです。
早いうちにMySQLとかSQLiteあたりはいじってみてください。
お返事ありがとうございます。
hogehoge78様に追加で頂いたアドバイス(回答No2)のほうにお礼の方まとめさせて頂きましたm(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl Perlで特定文字列から特定文字列までを抜き出したい 4 2022/04/02 14:24
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- システム 外付けHDDの初期化について 4 2023/03/05 21:19
- システム 外付けHDDの初期化について 4 2023/03/05 20:00
- YouTube ユーチューブへの動画投稿にサムネイルを付ける方法は? 1 2022/07/21 23:45
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(SNS・コミュニケーションサービス) 【至急】Microsoft teamsログインできないループ・・ 3 2023/05/17 13:17
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語でCSVファイルの行数を読...
-
別ファイルの構造体の値を読み...
-
エラーメッセージ(無効な間接...
-
csvの内容を行単位で削除したい
-
2次元配列のソート
-
変数が多い場合の処理について
-
ヒアドキュメントの中のfor文
-
doxygenを使用する環境について
-
CSVファイルの最終行のデー...
-
While文を使って配列の中身を全...
-
C言語の配列をPush(追加)する...
-
配列をループでたくさん宣言し...
-
np.stack()とnp.array()の違い
-
$_SESSIONに二次元配列を使える...
-
多次元配列をエンコードする関...
-
多次元配列のカウント+1の仕方
-
SQL文の実行結果を変数で受けて...
-
php で1から100までの素数の表...
-
VB.NET で 二次元のハッシュは...
-
CakePHPのfindの取得件数は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【PHP】csvファイルへの書き出...
-
C言語でCSVファイルの行数を読...
-
csvの内容を行単位で削除したい
-
Resource id #3 と表示されま...
-
別ファイルの構造体の値を読み...
-
While文を使って配列の中身を全...
-
複数行のデータのPOST処理に関して
-
CSVでアップロードしたデータの...
-
PHPでCSVの一部の行を編集したい
-
自動で番号を振りたい
-
CSVファイルの最終行のデー...
-
PHPで、CSVファイルを、指定し...
-
stdClass Objectを連想配列のよ...
-
PHP5でCSVの指定行データだけを...
-
ブログのトラックバックについて
-
PHPで外部ファイルを読み込むと...
-
◆速い、ファイル読み込みは?
-
バイナリファイルの内容を、そ...
-
行数が30万件ほどあるCSVから、...
-
PHP 別ドメインへのファイル保存法
おすすめ情報