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

Форум PHP

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

 

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

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

тема: Проблема с созданием txt на сервере
 
 автор: Владимир55   (06.11.2008 в 11:21)   письмо автору
 
 

В теме http://softtime.ru/forum/read.php?id_forum=1&id_theme=44056 приведен способ записи с блокировкой текстового файла. К сожалению, в него вкралась ошибка. Эту ошибку автор, как они пишет, исправил у себя, но не отразил эти исправления в теме.

Из этого кода я взял часть, которая, как я полагаю, отражает его сущность. Вот это:

    // Создаём файл если он не существует
    if(!file_exists($filename))  fclose(fopen($filename, "a+t"));
    // Открываем файл для чтения и записи в режиме r+t
    $f=fopen($filename, "r+t") or die("Невозможно открыть файл");
    // Блокируем файл (блокировка с запретом "подвисания")
    while(!flock($f, LOCK_EX+LOCK_NB)) sleep(1);    // ждём одну секунду
    // Файл заблокирован, можно производить запись
    $count=fread($f,0);    // читаем значение счётчика
    $count=$count+1;    // увеличиваем значение счётчика
    ftruncate($f,0);    // очищаем файл
    fseek($f,0,SEEK_SET);    // переводим указатель в начало файла
    fwrite($f,$count);    // записываем новое значение
    fclose($f);        // закрываем файл


При работе код дает ошибку на строке $count=fread($f,0) - "Warning: fread() [function.fread]: Length parameter must be greater than 0."

И действительно, зачем считывать код нулевой длины?

Зачем вообще ограничивать длину считываемого кода?

К примеру, я предполагаю примеить этот принцип не только к счетчику, но и при записи текста. Может, вместо fread применить file_get_contents ?

  Ответить  
 
 автор: ч   (06.11.2008 в 12:08)
 
   для: Владимир55   (06.11.2008 в 11:21)
 

>> if(!file_exists($filename)

нет закрывающей скобки наверное

  Ответить  
 
 автор: ч   (06.11.2008 в 12:14)
 
   для: ч   (06.11.2008 в 12:08)
 

код был изменён rкак мне показалось

  Ответить  
 
 автор: Владимир55   (06.11.2008 в 12:23)   письмо автору
 
   для: ч   (06.11.2008 в 12:14)
 

Да, я откорректировал свой вопрос, чтобы выделить его сущность.

  Ответить  
 
 автор: ч   (06.11.2008 в 12:45)
 
   для: Владимир55   (06.11.2008 в 12:23)
 

мне больше странной показалась строка
>> while(!flock($f, LOCK_EX+LOCK_NB)) sleep(1);
почему sleep(1); ?

fread здесь как-то логичнее т.к. сразу после чтения делается перезапись файла

  Ответить  
 
 автор: Владимир55   (06.11.2008 в 13:08)   письмо автору
 
   для: ч   (06.11.2008 в 12:45)
 

Код не мой, и чем дольше я в нем копаюсь, тем меньше его понимаю...

  Ответить  
 
 автор: AcidTrash   (06.11.2008 в 13:19)   письмо автору
 
   для: Владимир55   (06.11.2008 в 13:08)
 

>$count=fread($f,0);
Всегда считал, что второй параметр указывает количество байт, которое нужно прочитать.
У вас же этот параметр 0, т.е. прочитать ноль байт.

  Ответить  
 
 автор: Владимир55   (06.11.2008 в 13:25)   письмо автору
 
   для: AcidTrash   (06.11.2008 в 13:19)
 

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

Скажите, а для чего автор сделал

while(!flock($f, LOCK_EX+LOCK_NB)) sleep(1);    // ждём одну секунду

Чего он ждет?

И почему нет разблокировки файла? Разве она не нужна?

  Ответить  
 
 автор: ddhvvn   (06.11.2008 в 13:30)   письмо автору
 
   для: Владимир55   (06.11.2008 в 13:25)
 

>...Чего он ждет?

Когда файл освободится =)
Конечно 1 сек многовато, но это минимальный отрезок времени, который можно задать.

  Ответить  
 
 автор: Владимир55   (06.11.2008 в 13:35)   письмо автору
 
   для: ddhvvn   (06.11.2008 в 13:30)
 

А есть смысл в этом ожидании?
Ведь процессы идут непрерывно, так за ту секунду, что вы его ждете, файл может освободиться, но его могут занять вновь!

Как мне кажется, это излишне. Если файл подвергнуть эксклюзивной блокировке при любом обращении к нему из любого скипта, то очередность образуется сама собой.

Разве не так?


А почему в конце нет разблокирования файла? Разве разблокировка не нужна?

  Ответить  
 
 автор: ч   (06.11.2008 в 14:21)
 
   для: Владимир55   (06.11.2008 в 13:35)
 

история умалчивает о том чего ждал автор кода )

например у меня на денвере под виндоввс вообще странные результаты показывает например такой тест:

три файла иммитируют два обращения к файлу и немного запутанно register_shutdown_function()

test.php
<?
echo time() .'<hr>';
virtual('test1.php');

$f=fopen('test.txt'"r+t");
if(
$f) echo 'файл открыт ' time() .'<hr>';
else die(
"Невозможно открыть файл");

if ( 
flock($fLOCK_EX+LOCK_NB)) echo 'файл заблокирован ' time() .'<hr>';
else die(
"Невозможно открыть файл");

?>
<hr>


test1.php

<?
function blf() {
$f2=fopen('test.txt'"r+t");
flock($f2LOCK_EX+LOCK_NB);
sleep(20);
}

register_shutdown_function('blf');
?>
скрипт test1.php отработал запустилась blf()<hr>


test.txt

test.txt


Немогу понять почему результат именно такой

1225970322
--------------------
скрипт test1.php отработал запустилась blf()
------------------------------
файл открыт 1225970322
------------------------------------
файл заблокирован 1225970322
-----------------------------------

Warning: fopen(test.txt): failed to open stream: No such file or directory in ...........l\test1.php on line 3 

Warning: flock() expects parameter 1 to be resource, boolean given in ...................l\test1.php on line 4


а так закрытие и разблокирование файлов должно происходить автомотически , по завершению работы скрипта

  Ответить  
 
 автор: ddhvvn   (06.11.2008 в 17:47)   письмо автору
 
   для: Владимир55   (06.11.2008 в 13:35)
 

Я если честно использовал этот скрипт всего пару раз и давно. Поэтому не задумывался наж этим.))
Просто так же как и Вы "содрал" с софтайма =)))

А насчет отпирания может Вы проглядели? )
Файл должен отпираться той же функцией flock со вторым параметром LOCK_UN

  Ответить  
Rambler's Top100
вверх

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