Есть задача сделать счетчик посещений страницы на Kylix.
Значение счетчика хранится в текстовом файле. Собственно процедура инкрементации счетчика выглядит так://в файле хранятся несколько счетчиков, index - номер счетчика
procedure TWebModule1.IncreaseQueryCount(index: integer);
var
s: TStringList;
i,j: integer;
begin
s:=TStringList.Create();
try
s.LoadFromFile('counter.txt');
if s.count>=2 then
begin
val(s[index],i,j);
inc(i);
s[index]:=inttostr(i);
s.SaveToFile('counter.txt');
end;finally
end;
s.destroy;
end;В один прекрасный момент counter.txt становится размером 0 байт. Как я понимаю, это происходит из-а того, что несколько экземпляров CGI одновременно пытаются получить доступ к файлу. Как можно решить эту проблему ? Нужно что-то типа mutex из Windows для разделения доступа к ресурсам. Я понимаю, что можно использовать записи в базе данных с возможностью блокировки, но в моем случае (настроить базу данных я точно не смогу, так как очень мало знаю Linux) нужен простейший путь - хранение в файле. Во всех статьях о "пишем счетчик на kylix" авторы этот вопрос как-то обходят стороной, и на письма не отвечают :)
>Есть задача сделать счетчик посещений страницы на Kylix.
>Значение счетчика хранится в текстовом файле. Собственно процедура инкрементации счетчика выглядит так:
>
>
>//в файле хранятся несколько счетчиков, index - номер счетчика
>procedure TWebModule1.IncreaseQueryCount(index: integer);
>var
> s: TStringList;
> i,j: integer;
>begin
> s:=TStringList.Create();
> try
> s.LoadFromFile('counter.txt');
> if s.count>=2 then
> begin
> val(s[index],i,j);
> inc(i);
> s[index]:=inttostr(i);
> s.SaveToFile('counter.txt');
> end;
>
> finally
> end;
> s.destroy;
>end;
>
>В один прекрасный момент counter.txt становится размером 0 байт. Как я понимаю,
>это происходит из-а того, что несколько экземпляров CGI одновременно пытаются получить
>доступ к файлу. Как можно решить эту проблему ? Нужно что-то
>типа mutex из Windows для разделения доступа к ресурсам. Я понимаю,
>что можно использовать записи в базе данных с возможностью блокировки, но
>в моем случае (настроить базу данных я точно не смогу, так
>как очень мало знаю Linux) нужен простейший путь - хранение в
>файле.
man 2 flockКак это в Хуликсе делается БМП
> Во всех статьях о "пишем счетчик на kylix" авторы этот
>вопрос как-то обходят стороной, и на письма не отвечают :)может потому что никто не пишет счетчики на Кайликсе?
>В один прекрасный момент counter.txt становится размером 0 байт. Как я понимаю,
>это происходит из-а того, что несколько экземпляров CGI одновременно пытаются получить
>доступ к файлу. Как можно решить эту проблему ? Нужно что-то
>типа mutex из Windows для разделения доступа к ресурсам. Я понимаю,Есть два решения - сложное и простое.
Сложное:
Переименуй файл в counter.$$, где $$ - уникальное число, например твой PID. Если переименование обломалось, засни на несколько мсек и пробуй ещё.
Открой counter.$$, прочти, запиши, закрой. Переименуй в counter.txt.
Простое:Не пиши CGI на Kylix.