Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизПоделитесь некоторыми принципами при создании 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.012 c