Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в файл 
:(
    Опции темы
Sardar
Дата 22.1.2004, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Cool smile.gif)) Цикл убираешь полностью:
$main=explode(" ", $all[$stroka]);
$main[$element]=$zamena;
$all[$stroka]="$main[0] $main[1]";
fwrite($fp, implode("\n",$all));

Далее представь сценарий два, одновременных запроса:
скрипт1: file()
скрипт2: file() - одинаковые данные как и у скрипт1
скрипт1: fwrite();
скрипт2: fwrite() - потеряли данные от скрипт1

Весело smile.gif




--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
PROme
Дата 22.1.2004, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Цитата
Цикл убираешь полностью:
$main=explode(" ", $all[$stroka]);
$main[$element]=$zamena;
$all[$stroka]="$main[0] $main[1]";
fwrite($fp, implode("\n",$all));


вот только не пойму как это работаетconfused.gif
надо будет завтра с утрица раздуплиться smile.gif
к стати там надо кое-че подправить:

Код
$main=explode(" ", $all[$stroka]);
$main[$element]="$zamena\n";
$all[$stroka]="$main[0] $main[1]";
fwrite($fp, implode("",$all));


а то пустые строки шпарит...
а при таком раскладе implode вобще нуженconfused.gif

Цитата
Далее представь сценарий два, одновременных запроса:
скрипт1: file()
скрипт2: file() - одинаковые данные как и у скрипт1
скрипт1: fwrite();
скрипт2: fwrite() - потеряли данные от скрипт1


а разве flock не для этого?
я раздул базы так что скрипты выполнялись 4.4...4.5 секунды, запустил сразу два скрипта... первый отработал как надо, второй подождал пока первый доработает и отработал сам, в итоге второй работал чуть менее 8 сек... целосность файла сохранена... люблю практику smile.gif или это не такconfused.gif


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Sardar
Дата 22.1.2004, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Цитата
вот только не пойму как это работает

Ты знаешь номер строки, следовательно не надо перебирать все строки. В конце склеиваешь все до одной строки и разом пишешь в файл.
Цитата
а разве flock не для этого?

Смотри:
1) в файле лежит "а"
2) скрипт1 прочел "a" из файла
3) скрипт2 прочел "а" из файла
4) скрипт1 заблокировал файл
5) скрипт2 ждет блокировки
6) скрипт1 решил записать "б" в файл т.к. раньше было "а"
7) скрипт1 разблокировал файл
8) скрипт2 решил записать "б" и перезаписывает "б" первого скрипта, т.е. как будто скрипт1 не работал.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
IZ@TOP
Дата 23.1.2004, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



2 PROme, не надо ... просто потом при записи делаешь implode("\r\n", $line_num); он в конце каждой строки вставит знак окончания строки.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Secandr
Дата 23.1.2004, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Человеки!
А что значит строка
Код
$all[$stroka]="$main[0] $main[1]";

Может имелов в виду:
Код
$all[$stroka]="implode(" ",$main);

? ? ? ? ? ? ? ? ? ?


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
PROme
Дата 23.1.2004, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Цитата
Смотри:
1) в файле лежит "а"
2) скрипт1 прочел "a" из файла
3) скрипт2 прочел "а" из файла
4) скрипт1 заблокировал файл
5) скрипт2 ждет блокировки
6) скрипт1 решил записать "б" в файл т.к. раньше было "а"
7) скрипт1 разблокировал файл
8) скрипт2 решил записать "б" и перезаписывает "б" первого скрипта, т.е. как будто скрипт1 не работал.


ну, не знаю, незнаю, спорить не буду, но погляди сюда:

Код
$fp=fopen("file.txt","w+");
flock($fp,LOCK_EX);

$main=explode(" ", $all[$stroka]);
$main[$element]="$zamena\n";
$all[$stroka]="$main[0] $main[1]";
fwrite($fp, implode("",$all));

flock($fp,LOCK_UN);
fclose($fp);


1) мы вначале октрываем файл в режиме w+ (Чтение и запись. Указатель текущей позиции устанавливается в начало файла, а все содержимое файла уничтожается. Если файл не существует, функция пытается создать его)

2) далее мы блокируем работу с фалом (вот тока интересно на запись или вобщеconfused.gif), но, насколько я понимаю работа блокируется ДЛЯ СТОРОННИХ функций, т.е. внутри скрипта где произошла блокировка файл свободен для записи...

3) твои 6),7),8), ИМХО, не верны - посмотри скрипт1 не ведет после блокировки никакой разблокировки - разблокировка непосредственно перед закрытием файта (ну и ясно что далеко после записи) - т.е. если скрипт1 заблокировал файл, то файл заблокирован для ВСЕХ кроме самого блокиратора (скрипта) и ему незачем его разблокировать чтоб произвести запись

ну, я так понимаю....

Цитата
implode("\r\n", $line_num);


понятно
это ж для виндыconfused.gif

Цитата
Человеки!
А что значит строкаCODE
$all[$stroka]="$main[0] $main[1]";

Может имелов в виду:
CODE
$all[$stroka]="implode(" ",$main);

? ? ? ? ? ? ? ? ? ?


конечно!
и не говори что твой вариант лучше - я теоретик, уже давно проверено:
одно и то же на твоем коде выполняется 1.25...1.30 с, мой вариант обеспечивает 0.75...0.8 с разницу чувствуешьconfused.gif

к стати, насчет скорости, благодаря тому что Sardar помог убрать цикл скорасть работы скрипта возврасла на 20-25% !!!

ЗЫ: у меня сейчас один вопрос остался (пока что ;) ) - насчет блокировки файла - я прав?
меня еще смущает место:

Код
flock($fp,LOCK_UN);
fclose($fp);


нельзя ли в начале закрыть файл, а потом разблокироватьconfused.gif он ведь все равно доступен для скрипта...
а еще слышал что можно и не анлочить файл, что при завершении работы скрипта там все на автомате анлочится (вполне реалистично, например юзер закрыл окно до того как скрипт закончил работу - нужно ж заанлочить файл....)


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Secandr
Дата 23.1.2004, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



PROme Будь теоретиком, я не мешаю.
Смысл $all[$stroka]="$main[0] $main[1]"; :

$all[$stroka]=$main[0]." ".$main[1];
Т.е. Строке $stroka массива $all присвоить значение двух ясеек $main.

А если у тебя 3 элемента в строке, тогда как?
P.S. Кстати $all[$stroka]=$main[0]." ".$main[1]; - будет быстрее. Ненужно время чтобы парсить "".


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
PROme
Дата 23.1.2004, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Цитата
А если у тебя 3 элемента в строке, тогда как?


это вопрос?
я так понимаю будет

Код
$all[$stroka]=$main[0]." ".$main[1]." ".$main[2];


Цитата
P.S. Кстати $all[$stroka]=$main[0]." ".$main[1]; - будет быстрее. Ненужно время чтобы парсить ""


ЗЫ: к стати, а ты прав, работает на 5...7% быстрее моего

Код
$all[$stroka]="$main[0] $main[1]";


smile.gif

так кто че хорошего скажет по поводу блокировки файла?




--------------------
SEO-мастер
PM MAIL WWW   Вверх
Sardar
Дата 23.1.2004, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Цитата
$all=file("file.txt");
$count=count($all);

Здесь проблема, ты прочел файл, а затем блокируешь, т.е. два скрипта могут одновременно прочесть файл, а затем кто-то первый его заблокирует. Последний перепишет все результаты и выйдет так, что первый скрипт как будто не работал. Xотя в твоем случае это неважно.
Блокировки:
LOCK_SH - другие могут читать, но не могут писать в файл
LOCK_EX - всем облом, выстраиваются в очередь
LOCK_UN - снять блокировку
При закрытии файла блокировка автоматически снимается.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
PROme
Дата 23.1.2004, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Цитата
Здесь проблема, ты прочел файл, а затем блокируешь, т.е. два скрипта могут одновременно прочесть файл, а затем кто-то первый его заблокирует. Последний перепишет все результаты и выйдет так, что первый скрипт как будто не работал. Xотя в твоем случае это неважно.


:-/ хочешь сказать что проблема в том...
есть файл:
Код

1 2 3
4 5 6
7 8 9


скрипт1 отработал, получили

Код

1 2 3
4 5 $s1
7 8 9


$s1 - значение с первого скрипта
а потом пошел 2-й и сделал:

Код

1 2 3
4 5 $s2
7 8 9


т.е затер то что делал первыйconfused.gif

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

1) значит приведенный выше скрипт не может привести к потере вследствии паралельной работеconfused.gif
2) анлок перед закрытием файла можно смело убиратьconfused.gif
3) ну, если не будет проблем с многочислеными знаками окончания строки в одной строке, то топик можно считать УСПЕШНО за вершенным smile.gif
4) если кто еще может подсказать как ускорить или оптимизировать

Код

<?php
$mtime = microtime();
$mtime = explode(' ',$mtime);
$t1 = $mtime[1] + $mtime[0];


#####################################################################

$stroka=3;
$element=1;
$zamena=911;

$all=file("file.txt");
$count=count($all);
$fp=fopen("file.txt","w+");
flock($fp,LOCK_EX);

$main=explode(" ", $all[$stroka]);
$main[$element]="$zamena\n";
$all[$stroka]=$main[0]." ".$main[1];
fwrite($fp, implode("",$all));

fclose($fp);

#####################################################################

$mtime = microtime();
$mtime = explode(' ',$mtime);
$t2 = $mtime[1] + $mtime[0];
$t=round($t2-$t1,4);
echo "$t";
?>

жду с нетерпением.
5) еще один интересный момент: скрипт1 читает:

Код
$all=file("file.txt");


но файл немалый, нужно некоторое время... в это время паралельно работающий скприт2 доходит до выполнения:


Код
$count=count($all);
$fp=fopen("file.txt","w+");
flock($fp,LOCK_EX); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


скрипт1 будет обломан на пол пути до окончания чтения или скрипт2 подожет пока будолага дочитаетconfused.gif
просто если скрипт2 (ой, боюсь...) не станет ждать никого... скрипт1 прочитает не ту инфу (скорее всего не полностью дочитает), а ведь после того как скрипт2 запишет ВЕРНЫЕ измененные данные, первыйскрипт примется за свою грязную работу и затрет файл своими НЕВЕРНЫМИ прочитаными (недочитаными) данными sad.gifsad.gifsad.gif
возможно ли такоеconfused.gif
6) ОГРОМНОЕ ВПАСИБО ВСЕМ КТО ОТВЕЧАЛ!!!


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Guest
Дата 23.1.2004, 16:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
скрипт1 будет обломан на пол пути до окончания чтения или скрипт2 подожет пока будолага дочитает
просто если скрипт2 (ой, боюсь...) не станет ждать никого... скрипт1 прочитает не ту инфу (скорее всего не полностью дочитает), а ведь после того как скрипт2 запишет ВЕРНЫЕ измененные данные, первыйскрипт примется за свою грязную работу и затрет файл своими НЕВЕРНЫМИ прочитаными (недочитаными) данными
возможно ли такое

Оба скрипта смогут прочесть файл паралельно, никто никого не обломит! Только при записи ты накладываешь блокировку. Кто не успел ждет(по умолчанию). Прикол что один будет ждать блокировки пока другие не дочитают весь файл, тогда получится n процессов имеющих одинаковые данные, тогда все будут думать что у них самые свежие данные, тогда n процессов дргу задружкой(вот здесь ты используешь блокировку) запишут свои данные, тогда создастся иллюзия как будто работал только один(самый последний) процесс.
А почему бы тебе не прочесть файл через fopen()->flock()->fread()->explode(), тогда файл будет заблокирован в самом начале.

  Вверх
Sardar
Дата 23.1.2004, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Елки, этот Guest был я


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
ElectricalStorm
Дата 23.1.2004, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: нет
Всего: 9



если хочешь на Perl создай тему в соответствующем разделе


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
ElectricalStorm
Дата 23.1.2004, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: нет
Всего: 9



Цитата

1 2 3
5 4 7
3 4 5
5 3 8
5 4 3
7 5 4
4 5 3
4 6 3

как измений i-й елемент в j-й строке, например елемент номер 2 в 3-й строке, т.е. четверку на 5 


вот на Perl (плохое решение)

Код

open FILE, "+<text.txt";

$q = 5; # количество символов в строке   (1 2 3) числа + пробелы
$n = 8; # номер строки

$positon = ($q * $n) + $q + 1;

$str = "9 9 9";

seek (FILE, $positon, 1);
print FILE $str;




--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
ElectricalStorm
Дата 23.1.2004, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: нет
Всего: 9



вот маленько получше
если ты хочешь с массивом

Код

open FILE, "+<text.txt";

$q = 6; # количество символов в строке  
$n = 8; # номер строки
$positon = ($q * $n) + $q + 1;

seek (FILE, $positon, 1);

$str_next = <FILE>;
@arr = split /\s+/, $str_next;
$arr[2] = 9; # изменяем 3 елемент массива

seek (FILE, 0, 0);
seek (FILE, $positon, 1);
print FILE "$arr[0] $arr[1] $arr[2] ";



--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0909 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.