Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запись в файл
 
 автор: Valick   (08.05.2008 в 22:48)   письмо автору
 
 

Необходимо получить файл вида:
Что было раньше
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($fLOCK_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($f0); // очищаем файл
    
rewind($f); // переходим в начало файла
    
foreach ($cont as $key=>$values)
    {
// Удаляем пустые строки массива (лучше ничего не смог придумать)
    
if($values=="") {unset($cont[$key]); continue;}
// Записываем строку из массива
    
fwrite ($f$values."\n");
    }

    
fclose($f);        // закрываем файл
    
return;  
    }
?>


Есть ли более рациональный подход?

   
 
 автор: sim5   (09.05.2008 в 09:46)   письмо автору
 
   для: Valick   (08.05.2008 в 22:48)
 

Есть - MySQL.

   
 
 автор: Temnovit   (09.05.2008 в 15:51)   письмо автору
 
   для: Valick   (08.05.2008 в 22:48)
 

Для работы с файлами, гораздо удобнее использовать функции file_put_contents() и file_put_contents(). А вообще и правда лучше воспользоваться базой данных. Если хостер не дает MySQL, то в 5-ой версии РНР всегда есть SQLite

   
 
 автор: Valick   (10.05.2008 в 11:48)   письмо автору
 
   для: Temnovit   (09.05.2008 в 15:51)
 

О существовании баз данных я знаю. И в последствии они будут использоваться.
Но в данном случае надо сделать файлами. Просто хочу оптимизировать код. Может есть другие варианты проверки пустого файла или работать с файлом напрямую (что у меня не получилось), а не считывать его в массив и записывать потом целиком. Про плоские файлы тоже пока речь не идёт.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования