- PR -

スクリプトで各月の1〜9日(数字が一桁の日付)が表示されません

1
投稿者投稿内容
Hohoho
会議室デビュー日: 2004/04/27
投稿数: 8
投稿日時: 2004-06-23 21:20
こんにちは。

FTPの各ログイン毎の使用量を表示させるために、PHP内で下記スクリプトを実行しています。しかし、実行結果に各月の10〜31日(2桁の日付)の結果は表示されるのですが、どうしても各月の1〜9日(数字が一桁の日付)が表示されません。環境はRedHat Linux 7.3です。

理由がわからないのです。

宜しくお願いします。

<HTML>

<?

$logfile = "/var/log/xferlog";
$handle = fopen ($logfile, "r");
while (!feof ($handle)) {
$buffer = fgets($handle, 4096);
$Tline = explode(" ",$buffer);

if(count($Tline)>1){
$FTPstat[$Tline[13]][total_bytes] += $Tline[7];
$FTPstat[$Tline[13]][direction][$Tline[11]] += $Tline[7];
$FTPstat[$Tline[13]][daily_bytes][$Tline[2]."-".$Tline[1]] += $Tline[7];
}

}
fclose ($handle);

echo "<div align=left><pre>";print_r($FTPstat);echo "</pre></div>";
?>
</HTML>



以下が結果出力です。

Array
(
[user_A] => Array
(
[total_bytes] => 7902414653
[direction] => Array
(
[i] => 7867990809
[o] => 34423844
)

[daily_bytes] => Array
(
[29-Apr] => 100864715
[30-Apr] => 107673059
[10-May] => 128757255
[11-May] => 102283238
[12-May] => 118782834
[13-May] => 117808517
[14-May] => 112068333
[15-May] => 124512858
[16-May] => 109133875
[17-May] => 55087419
[18-May] => 25735260
[19-May] => 21425549
[20-May] => 114821221
[21-May] => 96629054
[22-May] => 41204935
[23-May] => 120045155
[24-May] => 127001892
[25-May] => 100188975
[26-May] => 18167250
[27-May] => 122667566
[28-May] => 112961470
[29-May] => 18472147
[30-May] => 18284643
[31-May] => 17078889
[10-Jun] => 17306618
[11-Jun] => 18474269
[12-Jun] => 18304342
[13-Jun] => 19846068
[14-Jun] => 24240137
[15-Jun] => 19535598
[16-Jun] => 17011825
[17-Jun] => 18086455
[18-Jun] => 22455196
[19-Jun] => 44697829
[20-Jun] => 18350935
[21-Jun] => 18074829
[22-Jun] => 23852473
[23-Jun] => 19771842
)

)
)
瀬戸っぷ
ベテラン
会議室デビュー日: 2003/11/28
投稿数: 56
投稿日時: 2004-06-23 23:43
引用:

Hohohoさんの書き込み (2004-06-23 21:20) より:
FTPの各ログイン毎の使用量を表示させるために、PHP内で下記スクリプトを実行しています。
しかし、実行結果に各月の10〜31日(2桁の日付)の結果は表示されるのですが、
どうしても各月の1〜9日(数字が一桁の日付)が表示されません。



PHPは判らないのですが…
原因とおぼしきモノならば…
(と言っても対策は判りませんが…)

引用:

Hohohoさんの書き込み (2004-06-23 21:20) より:
$logfile = "/var/log/xferlog";
$handle = fopen ($logfile, "r");
while (!feof ($handle)) {
 $buffer = fgets($handle, 4096);
 $Tline = explode(" ",$buffer);

 if(count($Tline)>1){
  $FTPstat[$Tline[13]][total_bytes] += $Tline[7];
  $FTPstat[$Tline[13]][direction][$Tline[11]] += $Tline[7];
  $FTPstat[$Tline[13]][daily_bytes][$Tline[2]."-".$Tline[1]] += $Tline[7];
 }
}
fclose ($handle);



上記の部分ですが、半角スペースで切り出しているようですが、
1〜9日は日付の前に半角スペースが1つ入っているのでその分ズレているのではないでしょうか?
$Tline[1]に月は入っているのでしょうが、$Tline[2]が空で$Tline[3]に日付が入っているのでは…と。
そうなると、前提としている部分($Tline[13]・$Tline[11]・$Tline[7])が1つずつズレるコトになるかと。

# C言語でもstrtok()で切り出す際に似たような問題が発生するらしいですが。
## 半角スペースのインデカトがおかしくなっていたようなので引用では全角スペースで代用
Hohoho
会議室デビュー日: 2004/04/27
投稿数: 8
投稿日時: 2004-07-01 22:00
瀬戸っぷ さん

お返事ありがとうございました。この質問の後重責に耐えられず熱を出して休んでいました。私の専門はWebサイトを作ることなので、スクリプトなんて触ったことなくて、この手のことはまったくわからないのです。でもそれを専門にしていた先輩が突然辞めてしまって小さな会社ですし単純に私に廻ってきてしまったんです。同僚は私以上に不得意で、一人で数日考えても暗号のようでまったくわからずこちらで相談したのですが、これが出来ないことが余程自分でもプレッシャーに感じていたのか投稿後熱を出してしまいました。

本日瀬戸っぷ さんのアドバイスをもとに
$FTPstat[$Tline[13]][daily_bytes][$Tline[2]."-".$Tline[1]] += $Tline[7];
部分を
$FTPstat[$Tline[13]][daily_bytes][$Tline[3]."-".$Tline[2]] += $Tline[7];
に変えたりとか色々して見ましたが、やっぱりうまくいきません。
きっと私が瀬戸っぷ さんのアドバイスをちゃんと聞けていないのだと思います。

でもお返事本当にありがとうございました。こうやってヘルプしてくれる方がいると思うだけで嬉しいです。

未だに何がどう悪くてどこをどう直せばよいのか解決策がわかりませんが、頑張ってみます。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-07-02 00:15
1桁の行だけ tab が混入してる、、なんちゅぅ事はよもや在りませんわな・・・!?
瀬戸っぷ
ベテラン
会議室デビュー日: 2003/11/28
投稿数: 56
投稿日時: 2004-07-02 01:28
引用:

Hohohoさんの書き込み (2004-07-01 22:00) より:
本日瀬戸っぷ さんのアドバイスをもとに
$FTPstat[$Tline[13]][daily_bytes][$Tline[2]."-".$Tline[1]] += $Tline[7];
部分を
$FTPstat[$Tline[13]][daily_bytes][$Tline[3]."-".$Tline[2]] += $Tline[7];
に変えたりとか色々して見ましたが、やっぱりうまくいきません。



$FTPstat[$Tline[14]][daily_bytes][$Tline[3]."-".$Tline[1]] += $Tline[8];
とズレるではないか…と。

Webでちょっと見ただけなのであまり自信はないですが…
whileループ内を下記のようにしてみてはどうでしょうか?

while (!feof ($handle)) {
 $buffer = fgets($handle, 4096);
 $Tline = explode(" ",$buffer);

 if(count($Tline)>1){
  if(strlen($Tline[2])>0) {
   $FTPstat[$Tline[13]][total_bytes] += $Tline[7];
   $FTPstat[$Tline[13]][direction][$Tline[11]] += $Tline[7];
   $FTPstat[$Tline[13]][daily_bytes][$Tline[2]."-".$Tline[1]] += $Tline[7];
  } else {
   $FTPstat[$Tline[14]][total_bytes] += $Tline[8];
   $FTPstat[$Tline[14]][direction][$Tline[12]] += $Tline[8];
   $FTPstat[$Tline[14]][daily_bytes][$Tline[3]."-".$Tline[1]] += $Tline[8];
  }
 }
}

# 予想が当たってズレていた場合、print_r($FTPstat)で
# 他のも出てくるような気がしないでも……
Hohoho
会議室デビュー日: 2004/04/27
投稿数: 8
投稿日時: 2004-07-03 11:42
瀬戸っぷさん、
># 予想が当たってズレていた場合、print_r($FTPstat)で
># 他のも出てくるような気がしないでも……
こちらについては意味が分からなかったので何もしませんでした。

でも丁寧に教えてくださったのでそのお通りにしたら無事動きました。ありがとうございました。ほんとに嬉しいです。(泣)

コブラさんも気をとめてくださりありがとうございました。

ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-07-03 14:06
余談です。
引用:

瀬戸っぷさんの書き込み (2004-06-23 23:43) より:
# C言語でもstrtok()で切り出す際に似たような問題が発生するらしいですが。


System V の strtok(3) の実装の問題のことを言われているのだと
思いますが、あれはまた違う問題です。delimiter に選んだ文字(群)が
連続している場合にはすべてスキップされるので、「スペースが並んで
いたら番号がズレる」といった類の問題は生じません。

cut(1) を利用して
 cut -d " " -f
などとした場合には問題になりますね。

awk で $n を切り出す場合には、問題になりません。
1

スキルアップ/キャリアアップ(JOB@IT)