Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.09;
Скачать: CL | DM;

Вниз

Поделитесь некоторыми принципами при создании CGI для Apache   Найти похожие ветки 

 
Vogus   (2003-12-23 09:51) [0]

Как я понимаю cgi - это программа, которая запускается на сервере при вызове соответствующего URL.

Хочу, например, вести свой лог запросов в CGI. Если я буду открывать определенный файл на запись и писать туда лог-сообщение, то возможен конфликт, когда будут выполнятся 2 одновременно запроса по этому URL. Как здесь быть?

Если еще чего умного скажите - буду признателен!


 
pasha_golub ©   (2003-12-23 10:16) [1]

Это надо идти на сайт Апача, там все не так уж плохо описано.


 
panov ©   (2003-12-23 11:58) [2]

>Vogus (23.12.03 09:51)
Если я буду открывать определенный файл на запись и писать туда лог-сообщение, то возможен конфликт, когда будут выполнятся 2 одновременно запроса по этому URL. Как здесь б


Решается просто.
Первый экземпляр CGI захватывает файл в исключительное использование на запись, записывает лог, освобождает файл, второй ждет, пока не закончится запись из первого.


 
Vogus   (2003-12-23 12:14) [3]

А как насчет если лог вести в InterBase insert гарантированно пройдет. Но здесь затраты на конект к БД.

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


 
panov ©   (2003-12-23 12:21) [4]

>Vogus (23.12.03 12:14) [3]
Журнал на то и журнал, чтобы записывать короткие порции информации.
У меня был написан модуль для ведения логов(не для CGI), так строк длиной до 70 байт можно было писть до 2 тысяч в секунду запросто.

Вариантов решения несколько.

1. Каждый экземпляр CGI создает на время работы файл с уникальным именем для вдения своего лога(привязываясь ко времени). отдельная программы периодически собирает эти логи в один файл.
2. Работает отдельный процесс для ведения журнала, остальные передают ему строки для записи.
3. файл может быть открыт на запись одновременно несколькими экземплярами CGI.


 
Vogus   (2003-12-23 13:02) [5]

Еще есть вопросик.

Нужна переменная. Если первый экземпляр cgi прочитал ее, то второй должен получить значение больше на 1. И т.д. идет ее наращивание. Если эту переменную хранить в файле, то возникает предыдущий вопрос. Может можно как-то иначе?


 
Vogus   (2003-12-25 14:00) [6]

Помогите, подскажите где


procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
const WorkDir = "...";
ZipName = "...";
var SFile: TFileStream;
begin
SFile := nil;
try
Response.Title := "Download Price";
Response.CustomHeaders.Add("Content-Disposition=filename=price.zip");
Response.ContentType := "application/zip";
SFile := TFileStream.Create(WorkDir+ZipName, fmOpenRead or fmShareDenyWrite);
Response.ContentStream := SFile;
Response.SendResponse;
finally
SFile.Free;
DeleteFile(WorkDir+ZipName);
end;
end;


Почему не удаляется файл ZipName?


 
Карелин Артем ©   (2003-12-25 14:05) [7]

Потому что файл занят потоком Response.ContentStream...


 
Карелин Артем ©   (2003-12-25 14:06) [8]

SFile := nil; - Зачем???


 
fille   (2003-12-25 14:10) [9]

Cgi на Delphi? Ну вы блин даете!
PHP forever!!!


 
Карелин Артем ©   (2003-12-25 14:17) [10]

fille (25.12.03 14:10) [9]
Ну и что? У меня уже год нормально работают cgi дельфийские.


 
Vogus   (2003-12-25 14:27) [11]

2 Карелин Артем
Потому что файл занят потоком Response.ContentStream...
Волучается в этом процессе его не удалишь? Т.е. надо писать еще обработчик, который будет подчишать или пересматривать всю логику?

SFile := nil; - Зачем??? Чтобы Warning: Variable "SFile" might not have been initialized не было. Какие ещ здесь соображения?

2 fille
Подскажите, что я теряю при написании cgi на Delphi, нежели на PHP, если предполагается, что у данной задачи будет максимум 300 пользователей?


 
panov ©   (2003-12-25 14:35) [12]

>Vogus (25.12.03 14:27) [11]

Да ничего не теряешь.
cgi работает быстрее, чем интерпретатор Perl.


 
fille   (2003-12-25 14:39) [13]

Быстрее, но в случае использования VCL - много весит.


 
fille   (2003-12-25 14:40) [14]

Правда это "быстрее" ничего по сути в скорости не меняет


 
Vogus   (2003-12-25 14:45) [15]

Это наш сервер, так что о весе можно забыть.


 
Anatoly Podgoretsky ©   (2003-12-25 14:46) [16]

fille (25.12.03 14:39) [13]
Не используй, зачем?


 
Vogus   (2003-12-25 14:52) [17]

Вот такая задача:

Есть 4 DBF:
pr1_0.dbf
pr1_1.dbf
pr2_0.dbf
pr2_1.dbf

Клиенту нужны например pr1_0.dbf и pr2_1.dbf.

Я в самой cgi создаю zip-архив с каким-то именем и передаю его Response.ContentStream

Затем этот zip-архив ни кому не нужен, его следовало бы удалить.

Вопрос: как?

И второй вопрос:
DBF-ки переодически обновляются. Можно новые DBF-ки выкладывать, например, в папку out1, затем в out2, потом опять out1. И долна быть переменная указывающая, что свежие DBF-ки лежат в папке outX. Где хранить эту переменнную? Например в реестре? Хорошо это?


 
Карелин Артем ©   (2003-12-25 14:53) [18]

Vogus (25.12.03 14:27) [11]
Ты не присваивай, а копируй. Присваивание означает что у тебя 2 обьектные переменные становятся не просто одинаковыми, а ОДНИМ и тем же.


 
Vogus   (2003-12-25 15:05) [19]

Сделал вот так
SFile := TMemoryStream.Create;
SFile.LoadFromFile(WorkDir+ZipName);
Response.ContentStream := SFile;
Response.SendResponse;
DeleteFile(WorkDir+ZipName);
файл удаляется!


 
Anatoly Podgoretsky ©   (2003-12-25 15:06) [20]

panov © (25.12.03 14:35) [12]
Я переводил счетчики с перла на паскаль, ускорение более чем в три раза, при том что в Паскалевской штуке больше делалось, а размер конечно возрос значительно, ну и что на до он и комьютер чтобы крутить программы, а количество одновременных коннектов до 300.


 
panov ©   (2003-12-25 15:19) [21]

fille (25.12.03 14:39) [13]

Быстрее, но в случае использования VCL - много весит.
VCL? а это для чего?

>Anatoly Podgoretsky © (25.12.03 15:06) [20]

panov © (25.12.03 14:35) [12]
Я переводил счетчики с перла на паскаль, ускорение более чем в три раза, при том что в Паскалевской штуке больше делалось, а размер конечно возрос значительно, ну и что на до он и комьютер чтобы крутить программы, а количество одновременных коннектов до 300.


Не знаю, как насчет TWebApplication, но я псиал CGi как консольное приложение. Тут уж никакого ограничения на количество подключений точно нет.


 
Anatoly Podgoretsky ©   (2003-12-25 15:23) [22]

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



Страницы: 1 вся ветка

Текущий архив: 2004.01.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
11-25267
titnn
2003-04-15 20:05
2004.01.09
HELP ! Где StrToInt в KOL ?


6-25478
TButton
2003-11-07 22:34
2004.01.09
закрыть сокет


3-25206
Morfey
2003-12-11 20:02
2004.01.09
MySQL


1-25348
SergLight
2003-12-22 11:32
2004.01.09
Ошибка в TCombobox


14-25604
Nick-From
2003-12-19 13:29
2004.01.09
sophisticated DBcombobox