- - PR -
スクリプトで各月の1〜9日(数字が一桁の日付)が表示されません
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ) ) ) | ||||||||
|
投稿日時: 2004-06-23 23:43
PHPは判らないのですが… 原因とおぼしきモノならば… (と言っても対策は判りませんが…)
上記の部分ですが、半角スペースで切り出しているようですが、 1〜9日は日付の前に半角スペースが1つ入っているのでその分ズレているのではないでしょうか? $Tline[1]に月は入っているのでしょうが、$Tline[2]が空で$Tline[3]に日付が入っているのでは…と。 そうなると、前提としている部分($Tline[13]・$Tline[11]・$Tline[7])が1つずつズレるコトになるかと。 # C言語でもstrtok()で切り出す際に似たような問題が発生するらしいですが。 ## 半角スペースのインデカトがおかしくなっていたようなので引用では全角スペースで代用 | ||||||||
|
投稿日時: 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]; に変えたりとか色々して見ましたが、やっぱりうまくいきません。 きっと私が瀬戸っぷ さんのアドバイスをちゃんと聞けていないのだと思います。 でもお返事本当にありがとうございました。こうやってヘルプしてくれる方がいると思うだけで嬉しいです。 未だに何がどう悪くてどこをどう直せばよいのか解決策がわかりませんが、頑張ってみます。 | ||||||||
|
投稿日時: 2004-07-02 00:15
1桁の行だけ tab が混入してる、、なんちゅぅ事はよもや在りませんわな・・・!?
| ||||||||
|
投稿日時: 2004-07-02 01:28
$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)で # 他のも出てくるような気がしないでも…… | ||||||||
|
投稿日時: 2004-07-03 11:42
瀬戸っぷさん、
># 予想が当たってズレていた場合、print_r($FTPstat)で ># 他のも出てくるような気がしないでも…… こちらについては意味が分からなかったので何もしませんでした。 でも丁寧に教えてくださったのでそのお通りにしたら無事動きました。ありがとうございました。ほんとに嬉しいです。(泣) コブラさんも気をとめてくださりありがとうございました。 | ||||||||
|
投稿日時: 2004-07-03 14:06
余談です。
System V の strtok(3) の実装の問題のことを言われているのだと 思いますが、あれはまた違う問題です。delimiter に選んだ文字(群)が 連続している場合にはすべてスキップされるので、「スペースが並んで いたら番号がズレる」といった類の問題は生じません。 cut(1) を利用して cut -d " " -f などとした場合には問題になりますね。 awk で $n を切り出す場合には、問題になりません。 |
1