|
|
|
| Необходимо получить файл вида:
Что было раньше
a:1:{i:0;s:1:"7";}
Крылатая фраза
a:1:{i:0;s:1:"6";}
Сколько китов
a:1:{i:0;s:1:"3";}
|
Вот функция:
<?php
// Функция записи в файл
function write_file_func($file,$line,$mass)
{
// Создаём файл если он не существует
// ни в коем случае не используем w или w+
if(!file_exists($file))
{
fclose(fopen($file, "a+t"));
}
// Открываем файл для чтения и записи в режиме r+t
// некоторые версии FreeBSD имеют проблемы с режимом а+
// и не могут установить указатель на начало файла при помощи fseek
$f=fopen($file, "r+t") or die("Невозможно открыть файл");
// Блокируем файл (блокировка с запретом "подвисания")
while(!flock($f, LOCK_EX+LOCK_NB))
{
sleep(1); // ждём одну секунду
}
// Файл заблокирован, можно производить запись
// Если файл пуст, то просто обьявляем массив, если нет то читаем его
if (filesize($file)==0)
{
$cont=array();
}
else
{
rewind($f); // переходим в начало файла
$cont=explode("\n",fread($f,filesize($file)));
}
// Проверяем существование вопроса и ответа на него
if(in_array($line,$cont))
{
foreach($cont as $key=>$values)
{
// Если вопрос уже есть,то перезаписываем ответ
if($line==$values) {$cont[$key+1]=serialize($mass);}
}
}
else
{
// Добавляем новый вопрос и ответ на него в конец массива
array_push($cont,$line,serialize($mass));
}
ftruncate($f, 0); // очищаем файл
rewind($f); // переходим в начало файла
foreach ($cont as $key=>$values)
{
// Удаляем пустые строки массива (лучше ничего не смог придумать)
if($values=="") {unset($cont[$key]); continue;}
// Записываем строку из массива
fwrite ($f, $values."\n");
}
fclose($f); // закрываем файл
return;
}
?>
|
Есть ли более рациональный подход? | |
|
|
|
|
|
|
|
для: Valick
(08.05.2008 в 22:48)
| | Есть - MySQL. | |
|
|
|
|
|
|
|
для: Valick
(08.05.2008 в 22:48)
| | Для работы с файлами, гораздо удобнее использовать функции file_put_contents() и file_put_contents(). А вообще и правда лучше воспользоваться базой данных. Если хостер не дает MySQL, то в 5-ой версии РНР всегда есть SQLite | |
|
|
|
|
|
|
|
для: Temnovit
(09.05.2008 в 15:51)
| | О существовании баз данных я знаю. И в последствии они будут использоваться.
Но в данном случае надо сделать файлами. Просто хочу оптимизировать код. Может есть другие варианты проверки пустого файла или работать с файлом напрямую (что у меня не получилось), а не считывать его в массив и записывать потом целиком. Про плоские файлы тоже пока речь не идёт. | |
|
|
|