добавление в массив в файле кэша без перезаписи всего файла - PullRequest
1 голос
/ 18 марта 2012

Итак, у меня есть файл с именем 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 ]

1 голос
/ 18 марта 2012

Это очень, хм, странный метод кеширования. Предположим, вы хотите изменить некоторый 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

Изменение входного файла может вызвать огромные проблемы.

Также проблема с методом, описанным выше, если бы этот процесс происходил многократно, в ТОЧНУЮ же миллисекунду - что-то испортилось бы, верно?

Правильно, читайте о блокировке файлов.

1 голос
/ 18 марта 2012

Это не похоже на отличный способ кеширования, просто потому что вы должны задать этот вопрос. Должно быть легко добавить новую запись.

Мой совет либо:

  1. использовать таблицу базы данных с именем cache и либо добавлять новые строки, либо извлекать, изменять и записывать только одну строку, как вам нужно.

    Или

  2. Используйте файл, который не содержит PHP-код, но что-то еще, например CSV, где вы можете легко добавить его, не беспокоясь о закрытии точек с запятой и т. Д., И вы также можете быстро прочитать его, используя встроенный в PHP библиотека функций, таких как fgetcsv (), когда вам нужно.

...