附加到缓存文件中的数组而不重写整个文件

时间:2012-03-18 13:14:49

标签: php arrays caching multidimensional-array

所以我有一个名为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

编辑:同样是上述方法的一个问题,如果这个过程多次发生,那么在相同的毫秒时间内会发生一些事情 - 对吗?

2 个答案:

答案 0 :(得分:1)

这似乎不是一种很好的缓存方式,只是因为你不得不提出这个问题。添加新条目应该很容易。

我的建议是:

  1. 使用名为cache的数据库表,并根据需要添加新行或检索,更改和只写一行。

  2. 使用不包含PHP代码的文件,但使用其他类似CSV的文件,您可以轻松附加到该文件而不必担心关闭分号等,您也可以使用内置的PHP快速阅读它库函数如fgetcsv()在需要时。

答案 1 :(得分: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);
...

然后你只需将内容添加到文件末尾,就像这样

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

但是如果你不能改变定义数组traffic_array的方法,那么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

更改输入文件可能会导致很大的问题。

  

同样是上述方法的一个问题,如果这个过程多次发生,那么在相同的毫秒时间 - 某些东西会搞砸,对吗?

是的,请阅读文件锁定。