2012-03-18 7 views
1

多次元配列を使用して、サイトのトラフィック分析を格納するcacheというファイルがあります。ファイル全体を書き直さずにキャッシュファイル内の配列を処理する

cache.php

$traffic_array=array("date_ip_uniqueNU"=>array("pageviews"=>34,"time_enteredOnsite"=>"12:00"),"date_ip_uniqueNU"=>array("pageviews"=>34,"time_enteredOnsite"=>"12:00"));//ect ect 

は今、私は何とか上記のアレイに追加する必要があります。

私は単純に、ファイル全体を読んで通過し、foreachループでアレイを再構築して、ちょうど再書き込みファイル全体、このようなものでした:それで、あなたは何を参照ください

include('cache.php'); 

foreach($traffic_array as $mainKey){ 

$rebuild_contents.="array("something"=>array("pageviews"=>".$mainKey['pageviews'].","time_enteredOnsite"=>".$mainKey['time_enteredOnsite'].");"//so I'm just building a string containing all the code to re-write the file. 

} 

//then write to the file 

$file="cache.php"; 

$content_to_put"\<? \$traffic_array=\"$rebuild_content\";" 

file_put_contents($file,$content_to_put); 

//NOTE: I just quickly wrote this up now, so expect syntax errors. 

私は上記のようにしました。配列の内容を文字列に再構築し、その文字列をキャッシュファイルに書き込むだけです。

しかし、私はこれにはるかに良いアプローチがあると確信していますので、誰かが私を助けることができますか?

ありがとうございました! xD

EDIT:上記の方法にも問題があります。このプロセスが複数回発生する場合は、同じミリ秒で、何かがうんざりするでしょうか?

+0

広告編集:はい。それを防ぐには 'flock()'を使用してください – Robus

+0

@Robusこれは面白いです - だから、ファイルがすでに使用されているかどうかを確認するには? –

+0

http://www.php.net/manual/en/function.flock.phpを参照してください。 – Robus

答えて

1

これは、非常に、奇妙なキャッシング方法です。 ファイル内のいくつかのPHPコードを変更したいとします。

file_put_contentsにはファイルの最後にデータを追加する機能があり、このメソッドをフラグFILE_APPEND(details)でコールします。 あなたはこの好きに配列を定義する方法で変更される場合があります。

$traffic_array[new key 1] = array(new data 1); 
$traffic_array[new key 2] = array(new data 2); 
... 

をそして、あなたは、配列traffic_arrayを定義する方法を変更することはできませんならば、あなただけの

file_put_contents($file, '$traffic_array[your new key] = array(data for adding);', FILE_APPEND); 

次のようにファイルの末尾にコンテンツを追加しかし、 file_put_contentsはあなたのためではありません。 fopen()とフラグ 'r +'を使用し、 fseek()を使用して、新しいデータをファイルに保存するための正しい場所にポインタを移動し、新しいデータを書き込む場合は fwrite()fclose()を使用します。

// Content of file: <?php $a = array('k' => array(), 'k2' => array());\n 
$f = fopen('file', 'r+'); 
fseek($f, -3, SEEK_END); // place the pointer after last value of array, before ");\n"; cont from end 
fwrite($f, ", 'k3' => array('f'=>'a'));\n"); // put new data, also add overwrited data ");\n" 
fclose($f); 
//now content of file: <?php $a = array('k' => array(), 'k2' => array(), 'k3' => array('f'=>'a'));\n 

入力ファイルを変更すると大きな問題が発生する可能性があります。

また、上記の方法で問題が発生した場合、このプロセスが複数回発生する場合は、同じミリ秒で正確に何かがうんざりするでしょうか?

右は、ファイルのロックについて読んでください。

1

これは、この質問をする必要があるため、キャッシュの素晴らしい方法のようには見えません。新しいエントリを追加するのは簡単なことです。

私のアドバイスは、どちらかにある:

  1. はキャッシュと呼ばれるデータベーステーブルを使用し、どちらかのあなたがする必要があるとして、1行のみを新しい行を追加したり、取得、変更および書き込み。

    それとも

  2. PHPコードが含まれていないファイルを使用しますが、あなたは簡単に閉じセミコロンなどを気にすることなく、それに追加することができ、そしてあなたもすぐにそれを読むことができるCSV、のような何か他のもの必要な時にfgetcsv()のような組み込みのPHPライブラリ関数を使用します。

関連する問題