phpでアクセス解析を作っているのですが、
解析データをログファイルに書き込みする際に
たまにデータが全部消えてしまう現象に陥りました。

下記コードでログファイルに書き込み処理をしています。
どなたか原因が分かる方、ご教授お願いいたします。


// ログデータ処理
$logdata = file($counter->logfile);
list($time,$host) = explode("\t",$logdata[0]);// 比較のため直前のホスト取得
if($host != $counter->host and // 連続アクセスは処理しない
!$out_flag){// 除外ホストは処理しない
$str =
time()."\t".// 時間
$counter->host."\t".// ホスト
$counter->agent."\t".// ユーザーエージェント
$counter->referer."\t".// リンク元
"\t\n";
$lp = fopen($counter->logfile,"w");
$lock = flock($lp,LOCK_EX);
if($lock){
fputs($lp,$str);
$i = 1;
foreach($logdata as $value){
fputs($lp,$value);
$i++;
if($i >= $counter->loglimit){break;}// ログ上限に達したら抜ける
}
}
flock($lp,LOCK_UN);
fclose($lp);
}

このQ&Aに関連する最新のQ&A

A 回答 (1件)

fopen($counter->logfile,"w");の時点でファイルは空になっていますから、このタイミングで(ロックする前に)他からfile()で読んだら何もない状態です。



比較のための直前ホストの取得などはfile()で読み込んだものでもいいですが、実際に「書き込み」をするときには、"rw"で開く→ロック→全行を再取得→ファイルポインタを先頭に戻す→追加データ+再取得データを書き込み→ロック解除でないとマズイのでは?

この回答への補足

ご解答ありがとうございます。


具体的なコードが分からず困っております。
もし差し支えなければ教えていただければ幸いです。

どうかよろしくお願いいたします。

補足日時:2011/11/04 13:04
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q文字列として"(ダブルコーテーション)を表示させる方法

こんにちは。文字列として、ダブルコーテーションを表示させるには、どうすればよいのか教えてください。m(__)m


例えば、
<font size="2">あいうえお</font>

というタグの「あいうえお」の部分が、セルA1にあった場合、

="<font size="2">"&A1&"</font>"という表示にしたいのです。

"2"のダブルコーテーションも文字列として表示させるには、どうすればよろしいのでしょうか。

教えてください。よろしくお願い致します。

Aベストアンサー

こんにちは~

表示形式は 「標準」 のままで、
ダブルコーテーションを、ダブルコーテーションで囲んでください。

""2""

="<font size=""2"">"&A1&"</font>"

としてみてください。

Qlogrotateの再起動

先日、使用していたサーバの
/var/log内のデータが溢れてしまい
Syslog、cronなどが止まってしまいました。

現在は、Syslog、cronなどは再起動をかけたので動いているのですが
logrotateがされず、このままだとまたあふれてしまう可能性があります…。
(あふれる前は動いていたのですが、Syslogのデータを/var/log/ないで行っており、整理をしなかったので溢れてしまいました)

私の考えでは、cronを再起動させれば動くものだとばかり思っていたのですが
うまくいかず、どうしたらいいのか困っています。

どなたか、同じような経験をされた方、対処法をご存知の方ご教授頂けないでしょうか?
よろしくお願いします。

Aベストアンサー

lowrider_2005 さんの回答で十分と思いますが、

> 私の考えでは、cronを再起動させれば動くものだとばかり思っていた
> のですがうまくいかず、どうしたらいいのか困っています。

logrotate は設定した条件が満たされた場合にログのローテーションを行
います。ログがあふれそうで緊急にローテーションさせたいというときに
は、

# logrotate -f /etc/logrotate.conf

のように '-f' をつけて logrotate コマンドを実行すると強制的に
ローテーションします。

QSELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか

SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか?
MYSQLサーバのバージョンは5.0.77です。

下記のように「*」を使用して指定テーブルの全カラムを表示する方法がありますが、
SELECT TableName.* FROM TableName

上記の逆で、指定テーブルの指定カラム以外の全カラムを一括指定って可能でしょうか?
例えば下記のような「^」みたいな、又は同等な書き方があれば良いなと思ってまして。
SELECT TableName.^ColumnName1 FROM TableName

ちなみに、下記のように一つ一つ表示したいカラムを指定する方法以外です。
SELECT TableName.ColumnName2 , TableName.ColumnName3 FROM TableName

よろしくお願いします。

Aベストアンサー

ない。
SQL文でそんなことをするより、メソッドとして作ればいいんじゃないですか。
だいたい、それ以外のカラムの数がわからないし、並びも不明だし。

#1に方と同じで
SELECT * from xxxx
なんてのは正気の人間は書きません。
カラムの数も位置も属性もわからないSQL文の結果をどうやって扱うのか。


人気Q&Aランキング