PHP и работа с файлами.

R
На сайте с 13.06.2009
Offline
47
557

Ситуация такая.

Есть один процесс писатель (больше одного в единицу времени не будет), и есть много читателей. Будут ли какие не то проблемы если в момент записи кто то решит почитать?

Т.е. надо ли в такой ситуации ставить блокировки?

[Удален]
#1
recrut:
Т.е. надо ли в такой ситуации ставить блокировки?

желательно :)

писателю то нет, а вот читатели "каааку" прочитают :)

T.R.O.N
На сайте с 18.05.2004
Offline
314
#2

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

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
maxwell
На сайте с 29.04.2009
Offline
149
#3

Пиши во временный файл, а потом

<?php rename("/tmp/file.tmp", "/tmp/file.txt");?> 
T
На сайте с 30.10.2008
Offline
17
#4

а чем sql не устроил?) сейчас хостинги любой ценовой категории предоставляют бд

R
На сайте с 13.06.2009
Offline
47
#5
maxwell:
Пиши во временный файл, а потом
<?php rename("/tmp/file.tmp", "/tmp/file.txt");?> 

Что то я не понял как это использовать. У меня есть файл с данными (и он один) читатели его читают, а писатель читает очищает, добавляет в считаное и снова пишет в файл. Пока решил использовать просто flock с LOCK_EX - для писателя и LOCK_SH для читателей.

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

maxwell
На сайте с 29.04.2009
Offline
149
#6
recrut:
Что то я не понял как это использовать. У меня есть файл с данными (и он один) читатели его читают, а писатель читает очищает, добавляет в считаное и снова пишет в файл. Пока решил использовать просто flock с LOCK_EX - для писателя и LOCK_SH для читателей.

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

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

Допустим, есть файл tags_cloud.txt, в который ты по cron-у пишешь облако тэгов, исходя из выборки в mysql. У меня, например, это весьма трудоемкий процесс.

Итак, твой скрипт, который запускается автоматически (или вручную), выглядит примерно так:


$buf='';
foreach ($records as $r) {
$buf .= "<a href='/?page=$r
}
file_put_contents('tags_cloud.tmp', $buf);
// тут еще что-то можно сделать с файлом
rename("tags_cloud.tmp", "tags_cloud.txt");
" title="</a>";
}
file_put_contents('tags_cloud.tmp', $buf);
// тут еще что-то можно сделать с файлом
rename("tags_cloud.tmp", "tags_cloud.txt");
" target="_blank"></a>";
}
file_put_contents('tags_cloud.tmp', $buf);
// тут еще что-то можно сделать с файлом
rename("tags_cloud.tmp", "tags_cloud.txt");
" title="'>$r
}
file_put_contents('tags_cloud.tmp', $buf);
// тут еще что-то можно сделать с файлом
rename("tags_cloud.tmp", "tags_cloud.txt");
" title="</a>";
}
file_put_contents('tags_cloud.tmp', $buf);
// тут еще что-то можно сделать с файлом
rename("tags_cloud.tmp", "tags_cloud.txt");
" target="_blank"></a>";
}
file_put_contents('tags_cloud.tmp', $buf);
// тут еще что-то можно сделать с файлом
rename("tags_cloud.tmp", "tags_cloud.txt");
" target="_blank">'>$r
}
file_put_contents('tags_cloud.tmp', $buf);
// тут еще что-то можно сделать с файлом
rename("tags_cloud.tmp", "tags_cloud.txt");
" title="</a>";
}
file_put_contents('tags_cloud.tmp', $buf);
// тут еще что-то можно сделать с файлом
rename("tags_cloud.tmp", "tags_cloud.txt");
" target="_blank"></a>";
}
file_put_contents('tags_cloud.tmp', $buf);
// тут еще что-то можно сделать с файлом
rename("tags_cloud.tmp", "tags_cloud.txt");

Хотя у меня реализовано несколько иначе. Скрипт пишет в stdout через echo. А сам php-скрипт вызывается sh-скриптом, который после выполнение php-скрипта просто переименовывает его вывод в рабочий файл.

Если не понятно, пиши. Можно в ЛС.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий