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
| Old | New | Line | |
|---|---|---|---|
| 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).* |
