Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
1-25286
kotel
2003-12-25 16:53
2004.01.09
Панель инструментов


14-25543
dDan
2003-12-18 16:17
2004.01.09
Пара простеньких вопросов


1-25320
}|{yk
2003-12-22 18:30
2004.01.09
Глючу. Не появляется кнопка ? в меню приложения


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


1-25344
Романов Р.В.
2003-12-19 14:18
2004.01.09
Com в dll + Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский