Sign in Join
Wiki copytemporary

CGI Web Programming/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: CGI Web Programming/ru

OldNewLine
1+Эта статья содержит основные сведения об CGI программировании. Обратите внимание, что использование специализированных сред разработок, будет гораздо продуктивным.
2+
3+## Общие сведения
4+
5+[Общий интерфейс шлюза - **CGI** (Common Gateway Interface)](http://ru.wikipedia.org/wiki/Common_Gateway_Interface) в общих чертах работает следующим образом:
6+
7+У нас есть два компьютера:
8+
9+- Компьютер-сервер, на этом компьютере будут храниться файлы (веб-страницы, изображения и Cgi-скрипты);
10+- Компьютер-клиент, этот компьютер имеет браузер для запроса файлов, хранящихся на сервере.
11+
12+Вы можете использовать Cgi-скрипты только, если ваш сервер обладает поддержкой CGI. После размещения ваших файлов CGI, вы можете получить доступ к ним по ссылке вида: **http://www.ваш_сервер.зона\[:порт\]/ваш_логин/cgi-bin/имя_cgi_программы.exe**
13+
14+**Примечания:**
15+
16+- Файл с CGI программой может не иметь расширение **.exe**. Чаще всего расширение у таких программ .cgi это настраивается на веб-сервере.
17+- CGI программа должна быть откомпилирована для платформы сервера (Linux, Windows...)
18+
19+## Об использовании FreePascal для CGI
20+
21+CGI программа, написанная на Free Pascal, является обычной программой, как и любая другая. В отличии от CGI программы, написанной на Perl, Free Pascal CGI не интерпретируется.
22+
23+Для тестирования CGI, необходимо установить на ваш компьютер "'HTTP Сервер"' с поддержкой CGI, например [Apache](http://ru.wikipedia.org/wiki/Apache_HTTP_Server).
24+
25+## Простой пример
26+
27+Ниже приведён небольшой пример простой CGI программы, которая осуществляет:
28+
29+1. Установку cookie
30+2. Вывод content-type (т.е. отмечает текст для передачи по HTTP)
31+3. Чтение файлов Cookie
32+4. Чтение данных формы переданных методом GET
33+5. Чтение данных формы переданных методом POST
34+
35+``` pascal
36+program mini;
37+
38+uses dos;
39+
40+var
41+ a:string;
42+ c:char;
43+begin
44+// устанавливаем cookie (должно быть выведено до передачи content-type)
45+// не забудьте изменить срок окончания
46+
47+writeln('Set-cookie:widget=value; path=/; expires= Mon, 21-Mar-2005 18:37:00 GMT');
48+
49+ // указываем тип содержимого, как html
50+ writeln('Content-Type:text/html',#10#13);
51+
52+ // получаем cookies
53+ a:= GetEnv('HTTP_COOKIE');
54+ writeln('cookies:',a);
55+
56+ // данные, переданные методом GET
57+ a:='';
58+ a:= GetEnv('QUERY_STRING');
59+ writeln('GET: ',a);
60+
61+ // данные, переданные методом POST
62+ a:='';
63+ while not eof(input) do
64+ begin
65+ read(c);
66+ a:= a+c;
67+ end;
68+ writeln('POST: ',a);
69+end.
70+```
71+
72+## Простой счетчик посещений
73+
74+Приложение "'hitcounter"' представляет собой простой счетчик посещений для вашего веб-сайта.
75+
76+Исходный код находится здесь: [1](http://modelbuilder.svn.sourceforge.net/viewvc/modelbuilder/html/cgi/)
77+
78+## Отладка CGI программ
79+
80+Так как для запуска CGI приложения используется другой процесс, а сама программа ни чего не выводит на экран, её отладка более трудоёмка, чем обычных приложений.
81+
82+Одно из решений состоит в запуске из CGI-приложения отладчика:\
83+При использовании в программе, ниже приведенного кода, сначала, как часть инициализации, запустится терминал (windows:cmd, linux:xterm), а затем отладчик (gdb) для вызывающего процесса.
84+
85+Функция "sleep" выполняет прерывание программы, для инициализации gdb.
86+
87+Данный пример был протестирован на:
88+
89+- Windows XP32 с запущеным apache 2.2 (не работает для более свежих версий Windows, см. <http://forum.lazarus.freepascal.org/index.php/topic,21931.msg128849.html#msg128849>)
90+- Ubuntu 10.04 x64 c Apache 2.2
91+- Debian unstable x64 c Apache 2 (Feb 2013)
92+
93+Пример модуля, использующий отладку.
94+
95+``` pascal
96+unit SelfDebug;
97+
98+{
99+Инструкция:
100+-Подключить модуль в любом месте программы.
101+-Измените константу DEBUGGER на имя используемого вами отладчика (gdb, ddd,gdbtui...)
102+-Для Windows, если программа для отладки запущена в качестве службы (т.е. CGI приложение запущено
103+из Apache выполняемого как служба) убедитесь, что служба настроена как
104+«взаимодействовать с рабочим столом». Если так не сделать, будет запущен отладчик
105+без консоли. Он прервёт программу и зависнет, ожидая ввода.
106+- Для Linux: если программа для отладки, запущена другим пользователем (напр. CGI-приложением),
107+запустите "xhost +" в терминале, чтобы все пользователи могли подключиться к xserver.
108+ Если необходимо, измените DISPLAY, чтобы соответствовать вашей переменной окружения DISPLAY
109+}
110+
111+{$mode objfpc}{$H+}
112+
113+interface
114+
115+uses
116+ Classes, SysUtils,Process;
117+
118+implementation
119+
120+const
121+ {$ifdef windows}
122+ DEBUGGER='C:\lazarus\mingw\bin\7.3\gdb.exe';
123+ {$endif}
124+ {$ifdef linux}
125+ DEBUGGER='gdb';
126+ DISPLAY=':0.0';
127+ {$endif}
128+ MSWAIT=2000;
129+
130+var
131+ AProcess: TProcess;
132+
133+initialization
134+AProcess := TProcess.Create(nil);
135+{$ifdef windows}
136+AProcess.CommandLine := format('cmd /C START "Debugging %s" /WAIT "%s" "%s" %d"',[paramstr(0),debugger,paramstr(0),GetProcessID]);
137+{$endif}
138+{$ifdef linux}
139+AProcess.CommandLine := format('xterm -display %s -T "Debugging %s" -e "%s" "%s" %d',[DISPLAY,paramstr(0),DEBUGGER,paramstr(0),GetProcessID]);
140+{$endif}
141+AProcess.Execute;
142+sleep(MSWAIT);
143+finalization
144+AProcess.Free;
145+end.
146+```
147+
148+Исходник: <http://www.hu.freepascal.org/lists/fpc-pascal/2011-October/030752.html>
149+
150+Так же отладку можно реализовать через ведение журнала программы.
151+
152+## Существующие средства разработки для CGI приложений
153+
154+- [[Brook Framework]]
155+- [[fcl-web]]
156+- [Powtils](http://z505.com/powtils/idx.shtml)
157+- [ExtPascal](http://extpascal.googlecode.com).
158+
159+---
160+*From the Free Pascal wiki, page "CGI Web Programming/ru", as it stood on 2020-02-10 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history