2011-08-10 12 views
1

私はここでPHPのことを試している.NETの男です。だから今私の快適ゾーンから完全に外れています。PHPを使用してホストファイル、ログダウンロード、およびホストの統計情報を表示しますか?

  • download.php::私は私がやりたいTHINKする3つのファイルを持つことである

    (a)は(そうdownload.php?file=11クエリ文字列は、私に語った私はabc.zipホストする必要があり、ファイル名にIDの参照が含まれています)

    stats.log

    にこのダウンロードをログに記録する(b)のいくつかのコード(C)夫婦header()コールとreadfile() CA LL、this question

  • stats.logへの答えに似て:次の例のようになりますシンプルなログファイル。これにより、単にテキストの行を追加するだけでログを達成できるようになりますが、時折それを凝縮させることができます。


abc.zip 1234 
xyz.zip 4321 
abc.zip 1 
abc.zip 1 
abc.zip 1 
xyz.zip 1 
abc.zip 1 

  • stats.php:これは、最終的に統計情報を提供していPHPファイルです。リアルタイムまたはほぼリアルタイムにすることができます。おそらく、ファイルを毎分読み直してキャッシングすることができます。私は本当に気にしないし、これはすべて頻繁にヒットされませんが、私はこれが愚かな高価な操作ではないことを確認する必要があります。これはかなりのページである必要はありません。人間はそれを簡単に読むことができるので、そこには必要なものはありません。

abc.zip: 1238 downloads 
xyz.zip: 4322 downloads 

最終的に、私はデータベースまたは本に関わる他のシステムを望んでいない:stats.logの上記の例では、私は、これは以下のようなものを提供したいと思います。私はサーバーへのFTPアクセスしか持っていないので、ディレクトリにスクリプトを置く以外のことはできません。私はスクリプトがstats.txtへの書き込み権限を持っていることを確認する必要があることを認識しています。これは問題ありません。

私の質問です。私はそれらの数を持っていますが、私は彼らがPHPを知っている誰かにとっては非常に簡単だと信じています。

  1. 私は、download.phpのホスト部分が、ヘッダーの設定とreadfileの使用によって理解されていると思います。しかし、どのようにして、ファイルIDとファイル名を表すキー/値ペアのコレクションを得ることができますか?私が.NETにいたなら、私はvar foo = new Dictionary<int, string> {{11, "abc.zip"}, {12, "xyz.zip"}}のようなことをすることができましたが、これはPHPのように見えません。
  2. クエリーストリングを取得するにはどうすればよいですか?私は、 "stuff/download.php?file = 11"というURLから引っ張って11を取って、私のルックアップコレクションから "abc.zip"を取得する必要があります。
  3. stats.logファイルに改行を書き込むにはどうすればよいですか?
  4. stats.phpスクリプトでstats.logファイルをループしてカウントし、これらの統計情報をホストするにはどうすればよいですか?
  5. ボーナスの質問:手順4の結果をキャッシュし、1分/ 1時間に1回だけファイルを読み込むにはどうすればよいですか?

誰かが少なくともこれらの質問のほとんどに答えることができる場合は、おそらく間違いなく記入することができます。 :)

答えて

1

1-探しているのはarrayです。

$files=array(11=>'abc.zip', 
      12=>'xyz.zip'); 

2 - あなたのケースで$_GET['file']は、データはあなたが興味のあることを保持しているように、クエリ文字列は、スーパーグローバル$_GETによってアクセスされる。

3,4,5 私は情報JSONを格納推薦コード化される。例えば

$rawInfo=file_get_contents('stats.log'); 
$Info=json_decode($rawInfo,true); 
if(isset($Info[$_GET['file']])){ 
    $Info[$_GET['file']]++; 
}else{ 
    $Info[$_GET['file']]=1; 
} 
$rawInfo=json_encode($Info); 
$h=fopen('stats.log','c');// If $h is false, you couldn't open the file 
flock($h,LOCK_EX);// lock the file 
$b=fwrite($h,$rawInfo);// if $b is not greater than 0, nothing was written 
flock($h,LOCK_UN); 
fclose($h); 
//And then actually serve the file requested 

これは、すでに有用な形式で情報を保存する利点があります。

json_decodeデータをフェッチするたびに、処理方法を知る必要があるarrayの形式になります。私は受け入れ答えで@シャッドの助けを借りずに、そう簡単にこれをやったことがありませんでした

$rStats=file_get_contents('stats.log'); 
$Stats=json_decode($rStats,true); 
foreach($Stats as $k=>$v){ 
    echo $k.': '.$v.' download'.($v==1?'':'s'); 
} 
+0

フォローアップの質問:どのようにこれは同時ダウンロードを処理しますか?ダウンロード数を失ったり、統計ファイルをロックしたりして、他のダウンロードやその他のダウンロードでエラーが発生することはありますか?私は行を追加すると、ファイル全体を書き換えるよりも並行処理の問題がはるかに良くなると考えていました。 JSONデータとして保存する興味深いアイデア - 私はそれを考えなかった。 – Jaxidian

+0

さて、私は自分の質問に答えたと思います。私はそれを開く前に、ファイルをロックする必要がありますし、この質問への答えに似て、ロックを解除する:http://stackoverflow.com/questions/293601/php-and-concurrent-file-access – Jaxidian

+0

@ Jaxidian Haha、私たちは同じ答えを出してくれました。私の編集された反応を見てください。 – Shad

0

stats.phpは、次のようになります。このように、私は実際に誰かのために働くべきである私の最終的な解決策をここに掲載したいと思っていました。これにより、ダウンロードをロギングしながら、「ダイレクトリンク」(つまり、301/302や他の種類のリダイレクトは機能しません)が正常に機能します(右クリック - >同じように保存)。これはかなり "リソースが重い"ことに注意してください。共有ホストの中には、こういうものを使って動揺するかもしれませんが、私が知る限り、これは本当に大きな流出ではありません。私のファイルは〜3〜15MBでダウンロードしてもらえませんので、私のシナリオではあまり心配していませんが、このソリューションを使用する場合は、この事実を十分に理解してください!

download.php

<?php 
$fileLookup = array(
      0=>'subdir/test.zip', 
      1=>'another/sub/dir/test2.zip' 
     ); 

$currentRelativeFileName = $fileLookup[$_GET['file']]; 
$currentFileName = basename($currentRelativeFileName); 

$rawInfo=file_get_contents('stats.log'); 
$Info=json_decode($rawInfo,true); 

if(isset($Info[$currentFileName])){ 
    $Info[$currentFileName]++; 
}else{ 
    $Info[$currentFileName]=1; 
} 
$rawInfo=json_encode($Info); 
$h=fopen('stats.log','c');// If $h is false, you couldn't open the file 
flock($h,LOCK_EX);// lock the file 
$b=fwrite($h,$rawInfo);// if $b is not greater than 0, nothing was written 
flock($h,LOCK_UN); 
fclose($h); 

header("Content-type: application/octet-stream"); 
header("Content-disposition: attachment; filename=" . $currentFileName); 
readfile($currentRelativeFileName); 

?> 

stats.php

<html> 
<head> 
    <title>Here are my stats!</title> 
</head> 
<body> 
<?php 
$rStats=file_get_contents('stats.log'); 
if (strlen($rStats) > 5){ 
    $Stats=json_decode($rStats,true); 
    foreach($Stats as $k=>$v){ 
     echo $k.': '.$v.' download'.($v==1?'':'s') . '<br />'; 
    } 
}else{ 
    echo 'No downloads'; 
} 
?> 
</body> 
関連する問題