CGI - это общий интерфейс шлюза. Как следует из названия, это «общий» интерфейс шлюза для всего. Это так тривиально и наивно от названия. Я чувствую, что понял это, и чувствовал это каждый раз, когда сталкивался с этим словом. Но, честно говоря, я этого не сделал. Я все еще в замешательстве.
Я программист PHP с опытом веб-разработки.
запрос пользователя (клиента) на страницу ---> веб-сервер (-> встроенный интерпретатор PHP) ----> Серверный сценарий (PHP) ---> MySQL Server.
Теперь предположим, что мой PHP Script может получать результаты с сервера MySQL, сервера MATLAB и другого сервера.
Итак, теперь PHP Script является CGI? Потому что его интерфейс для веб-сервера и всех других серверов? Я не знаю. Иногда они называют CGI, технологию, а иногда называют CGI программой или каким-то другим сервером.
Что именно CGI?
В чем дело
/cgi-bin/*.cgi
? Что с этим? Я не знаю, для чего этотcgi-bin
каталог на сервере. Я не знаю, почему у них есть расширения * .cgi.Почему Perl всегда мешает. CGI & Perl (язык). Я также не знаю, что случилось с этими двумя. Я почти все время слышу эти два в сочетании "CGI & Perl". Эта книга является еще одним отличным примером программирования CGI с использованием Perl . Почему бы не "CGI Программирование с PHP / JSP / ASP"? Я никогда не видел таких вещей.
CGI Programming in C , меня сильно смущает. " в C " ?? Шутки в сторону?? Я не знаю, что сказать. Я просто запутался. " в C " ?? Это меняет все. Программа должна быть скомпилирована и выполнена. Это полностью меняет мой взгляд на веб-программирование. Когда я собираю? Как выполняется программа (потому что это будет машинный код, поэтому он должен выполняться как самостоятельный процесс). Как это общается с веб-сервером? IPC? и взаимодействие со всеми серверами (в моем примере MATLAB & MySQL) с помощью программирования сокетов? Я потерялся!!
Люди говорят, что CGI устарела и больше не используется. Это так? Какое последнее обновление?
Однажды я столкнулся с ситуацией, когда мне пришлось предоставить HTTP-запросу PUT доступ к веб-серверу (Apache HTTPD). Это длинная спина. Итак, насколько я помню, это то, что я сделал:
Отредактировал файл конфигурации Apache HTTPD, чтобы веб-сервер передавал все запросы HTTP PUT некоторым
put.php
(мне пришлось написать этот PHP-скрипт)Реализуйте put.php для обработки запроса (сохраните файл в указанном месте)
Люди говорили, что я написал CGI Script. Серьезно, я понятия не имел, о чем они говорили.
- Я действительно написал CGI Script?
Надеюсь, вы поняли, в чем заключается мое замешательство. (Потому что я сам не знаю, где я запутался). Я прошу вас, ребята, сделать ваш ответ максимально простым. Я действительно не могу понять любую причудливую техническую терминологию. По крайней мере, в этом случае.
РЕДАКТИРОВАТЬ:
Я нашел этот удивительный урок "CGI Programming Simple!" - CGI Tutorial , которая объясняет понятия в простейшем виде. После прочтения этой статьи вы можете прочитать статью « Начало работы с CGI-программированием на C», чтобы дополнить свое понимание реальными примерами кода. Я также добавил эти ссылки к этому руководству в статью Википедии: http://en.wikipedia.org/wiki/Common_Gateway_Interface
Ответы:
CGI - это интерфейс, который сообщает веб-серверу, как передавать данные в приложение и из приложения. Более конкретно, он описывает, как информация запроса передается в переменных среды (таких как тип запроса, удаленный IP-адрес), как тело запроса передается через стандартный ввод, и как ответ передается через стандартный вывод. Вы можете обратиться к спецификации CGI для деталей.
Чтобы использовать ваше изображение:
user (client) request for page ---> webserver ---[CGI]----> Server side Program ---> MySQL Server.
Большинство, если не все, веб-серверы могут быть настроены на выполнение программы как «CGI». Это означает, что веб-сервер после получения запроса перенаправит данные в определенную программу, установив некоторые переменные среды и упорядочив параметры через стандартный ввод и стандартный вывод, чтобы программа могла знать, где и что искать.
Основное преимущество заключается в том, что вы можете запускать ЛЮБОЙ исполняемый код из Интернета, учитывая, что и веб-сервер, и программа знают, как работает CGI. Вот почему вы можете писать веб-программы на C или Bash с помощью обычного веб-сервера с поддержкой CGI. Это и то, что большинство сред программирования могут легко использовать стандартный ввод, стандартный вывод и переменные среды.
В вашем случае вы, скорее всего, использовали другое, специфичное для PHP, средство связи между вашими скриптами и веб-сервером, это, как вы хорошо упомянули в своем вопросе, встроенный интерпретатор mod_php.
Итак, отвечая на ваши вопросы:
Смотри выше.
Это традиционное место для программ cgi, многие веб-серверы поставляются с этим каталогом, предварительно настроенным для выполнения всех двоичных файлов в качестве программ CGI. Расширение .cgi обозначает исполняемый файл, который должен работать через CGI.
Поскольку Perl является древним (старше, чем PHP, JSP и ASP, которые возникли, когда CGI был уже стар, Perl существовал, когда CGI был новым), и стал довольно известным как очень хороший язык для обслуживания динамических веб-страниц через CGI. В настоящее время существуют другие альтернативы для запуска Perl в веб-сервере, в основном mod_perl .
Вы компилируете исполняемый файл один раз, веб-сервер выполняет программу и передает данные в запросе программе и выводит полученный ответ. CGI указывает, что для каждого запроса будет запускаться один экземпляр программы. Вот почему CGI в настоящее время неэффективен и устарел.
CGI все еще используется, когда производительность не имеет первостепенного значения и требуются простые средства выполнения кода. Это неэффективно по ранее указанным причинам, и существуют более современные средства для выполнения любой программы в веб-среде. В настоящее время самым известным является FastCGI .
источник
Server side Program
на вашем рисунке мой PHP-скрипт. Итак, я никогда не занимался программированием на CGI? Потому что я никогда не писал ничего между веб-сервером и моим PHP-скриптом. Черт!! это убивает меняСредство для веб-сервера, чтобы получить свои данные из программы (вместо, например, файла).
Ничего страшного. Это просто соглашение.
Сервер должен знать, что делать с файлом (то есть обращаться с ним как с программой, которую нужно выполнить, а не с чем-то, что нужно просто обработать). Наличие расширения .html указывает на использование типа содержимого text / html. Наличие расширения .cgi говорит ему, что нужно запускать его как программу.
Хранение исполняемых файлов в отдельном каталоге дает некоторую дополнительную защиту от выполнения некорректных файлов и / или обслуживания программ CGI в качестве необработанных данных в случае неправильной настройки сервера.
Это не так. Perl был просто большим и популярным одновременно с CGI.
Я не использовал Perl CGI в течение многих лет. Я использовал mod_perl в течение долгого времени, и в эти дни склоняюсь к PSGI / Plack с FastCGI.
CGI не очень эффективен. Лучшие методы общения с программами с веб-серверов появились примерно в то же время, что и PHP. JSP и ASP - разные методы общения с программами.
Это язык программирования, почему бы и нет?
Он не должен выполняться как независимый процесс (вы можете писать модули Apache на C), но вся концепция CGI заключается в том, что он запускает внешний процесс.
STDIN / STDOUT и переменные среды - как определено в спецификации CGI.
Использование любых методов, которые вам нравятся и поддерживаются.
CGI неэффективен, медленен и прост. Это редко используется, когда это используется, это потому, что это просто. Если производительность не имеет большого значения, простота того стоит.
1,1
источник
CGI - это спецификация интерфейса между веб-сервером (HTTP-сервером) и исполняемой программой некоторого типа, которая должна обрабатывать определенный запрос.
Он описывает, как определенные свойства этого запроса должны быть переданы в среду этой программы и как программа должна передать ответ обратно на сервер, и как сервер должен «завершить» ответ, чтобы сформировать действительный ответ на исходный HTTP-запрос.
Некоторое время CGI был интернет-драфтом IETF, поэтому срок его действия истек. Он истек без обновления, поэтому не было CGI «стандарт». Сейчас это информационный RFC, но как таковая документация является обычной практикой и сама по себе не является стандартом. rfc3875.txt , rfc3875.html
Программы, реализующие интерфейс CGI, могут быть написаны на любом языке, работающем на целевой машине. Они должны иметь возможность доступа к переменным среды и, как правило, к стандартному вводу, и они генерируют свой вывод на стандартном выводе .
Обычно использовались скомпилированные языки, такие как C, как языки сценариев, такие как perl, часто использующие библиотеки для облегчения доступа к среде CGI.
Одним из больших недостатков CGI является то, что для каждого запроса создается новая программа, поэтому поддержание состояния между запросами может быть серьезной проблемой производительности. Состояние может быть обработано в файлах cookie или закодировано в URL, но если оно становится большим, оно должно храниться где-то еще и кодироваться из кодированной информации URL или файла cookie. Каждый вызов CGI должен был бы затем перезагрузить сохраненное состояние из хранилища где-нибудь.
По этой причине и благодаря очень простому интерфейсу запросов и сеансов лучше интегрированные среды между веб-серверами и приложениями становятся все более популярными. Среды, такие как современная реализация php с apache, намного лучше интегрируют целевой язык с веб-сервером и предоставляют доступ к объектам запросов и сеансов, которые необходимы для эффективного обслуживания запросов http. Они предлагают гораздо более простой и богатый способ написания «программ» для обработки HTTP-запросов.
Написали ли вы сценарий CGI, скорее зависит от интерпретации. Конечно, он справился с задачей, но гораздо более обычно запускать php как модуль, где интерфейс между скриптом и сервером не является строго CGI-интерфейсом.
источник
CGI указан в RFC 3875 , хотя это более поздняя «официальная» кодификация исходного документа NCSA . По сути, CGI определяет протокол для передачи данных о HTTP-запросе от веб-сервера в программу для обработки - в любую программу на любом языке. На момент написания спецификации (1993 г.) большинство веб-серверов содержали только статические страницы, «веб-приложения» были редкой и новой вещью, поэтому казалось естественным отделить их от «нормального» статического содержимого, такого как в
cgi-bin
каталог, кроме статического контента, и заканчивая им.cgi
.В то время здесь также не было выделенных «языков веб-программирования», таких как PHP, и C был доминирующим переносимым языком программирования - так много людей писали свои CGI-скрипты на C. Но Perl быстро оказался лучше подходящим для такого рода. и CGI на некоторое время стал почти синонимом Perl. Затем появились Java-сервлеты, PHP и многие другие, которые заняли большую часть рынка Perl.
источник
Посмотрите на CGI в Википедии. CGI - это протокол между веб-сервером и внешней программой или сценарий, который обрабатывает ввод и генерирует вывод, который отправляется в браузер.
CGI - это просто способ общения веб-сервера и программы, ни больше, ни меньше. Здесь сервер управляет сетевым соединением и протоколом HTTP, а программа обрабатывает ввод и генерирует вывод, который отправляется в браузер. Сценарий CGI может быть в основном любой программой, которая может выполняться веб-сервером и следует протоколу CGI. Таким образом, CGI-программа может быть реализована, например, на C. Однако это крайне редко, поскольку C не очень хорошо подходит для этой задачи.
/cgi-bin/*.cgi
это просто путь, на котором люди обычно размещают свой CGI-скрипт. По умолчанию веб-сервер настроен на выборку CGI-сценариев по этому пути.CGI-скрипт может быть реализован также на PHP, но все PHP-программы не являются CGI-скриптами. Если в веб-сервер встроен интерпретатор PHP (например, mod_php в Apache), то этап CGI пропускается посредством более эффективного прямого протокола между веб-сервером и интерпретатором.
Реализовали ли вы скрипт CGI или нет, зависит от того, как ваш скрипт выполняется веб-сервером.
источник
CGI, по сути, передает запрос любому интерпретатору, настроенному на веб-сервере - это может быть Perl, Python, PHP, Ruby, C почти все. Perl был самым распространенным в те дни, поэтому вы часто видите его в отношении CGI.
CGI не умер. На самом деле большинство крупных хостинговых компаний используют PHP как CGI, а не mod_php, потому что он предлагает конфигурацию на уровне пользователя и некоторые другие вещи, хотя он медленнее, чем mod_php. Ruby и Python также обычно запускаются как CGI. Ключевым отличием здесь является то, что серверный модуль работает как часть реального серверного программного обеспечения - где, как и в случае с CGI, он полностью находится за пределами сервера. Сервер просто использует модуль CGI, чтобы определить, как передавать и получать данные внешнему интерпретатору.
источник
CGI - это механизм, посредством которого веб-сервер вызывает внешнюю программу для обработки запроса, а переменные среды и стандартный ввод используются для подачи данных запроса в программу. Точный язык, на котором написана внешняя программа, не имеет значения, хотя легче писать программы CGI на некоторых языках, чем на других.
Поскольку для сценариев CGI требуются разрешения на выполнение, httpd по умолчанию разрешает запускать только программы CGI в
cgi-bin
каталоге в целях безопасности (возможно, теперь ошибочных).Большинство сценариев PHP запускаются в процессе веб-сервера через
mod_php
. Это не CGI.CGI работает медленно, так как программа (и связанный с ней интерпретатор) должны запускаться по запросу. Современные альтернативы - встроенное выполнение, используемое mod_php, и длительные процессы, используемые FastCGI. У данного языка может быть свой способ реализации этих механизмов, поэтому обязательно поспрашивайте, прежде чем прибегать к CGI.
источник
interpreter
php с php-fpm?Возможно, вы хотите знать, что не является CGI, и ответом является МОДУЛЬ для вашего веб-сервера (если я полагаю, что вы используете Apache). И это большая разница, потому что CGI нужна и внешняя программа, поток, что угодно для создания экземпляра сервера приложений PERL, PHP, C, где при запуске в качестве МОДУЛЯ эта программа сама по себе является веб-сервером (apache).
Из-за всего этого возникает много проблем с производительностью, безопасностью, переносимостью. Но хорошо сначала узнать, что такое не CGI, понять, что это такое.
источник
Пример из реальной жизни: сложная база данных, которую необходимо показать на веб-сайте. Поскольку база данных была разработана где-то в 1986 году (!), Большое количество данных было упаковано различными способами для экономии места на диске.
По мере развития разработчики больше не могли решать сложные запросы данных только на SQL, например, потому что алгоритмы сортировки были необычными.
Есть три разумных решения:
CGI запускает ваш скрипт в Solution # 3 и выводит эффект в браузер. У вас есть скорость скомпилированной программы, гибкость языка лучше, чем SQL, и вам не нужно писать плагины для SQL-сервера. (Опять же, это пример, специфичный для SQL и C)
источник
CGI-скрипт - это консоль / оболочка. В Windows, когда вы используете окно «Командная строка», вы запускаете консольные программы. Когда веб-сервер выполняет сценарий CGI, он обеспечивает ввод в консоль / оболочку с использованием переменных среды или «стандартного ввода». Стандартный ввод подобен вводу данных в консоль / оболочку; в случае сценария CGI веб-сервер выполняет набор текста. Сценарий CGI записывает данные в «стандартный вывод», и этот вывод отправляется клиенту (веб-браузеру) в виде HTML-страницы. Стандартный вывод аналогичен выводу, который вы видите в программе консоли / оболочки, за исключением того, что веб-сервер читает его и отправляет.
Сценарий CGI может быть выполнен из браузера. URI обычно включает строку запроса, которая предоставляется сценарию CGI. Если метод «get», то строка запроса передается в CGI Script в переменной среды с именем QUERY_STRING. Если метод «post», то строка запроса передается в CGI Script с использованием стандартного ввода (CGI Script считывает строку запроса из стандартного ввода).
Раннее использование CGI-скриптов было для обработки форм. В начале HTML-формы HTML обычно имели атрибут «действие» и кнопку, обозначенную как кнопка «отправить». При нажатии кнопки отправки URI, указанный в атрибуте «action», будет отправлен на сервер с данными из формы, отправленными в виде строки запроса. Если в «действии» указан сценарий CGI, сценарий CGI будет выполнен, а затем будет создана HTML-страница.
RFC 3875 «Common Gateway Interface (CGI)» частично определяет CGI, используя C, как, например, говоря, что переменные окружения «доступны через подпрограмму библиотеки C getenv () или переменную environment».
Если вы разрабатываете сценарий CGI с использованием C / C ++ и используете для этого Microsoft Visual Studio, то вам следует разработать консольную программу.
источник
CGI - это программа (или веб-API), которую вы пишете и сохраняете на сайте веб-сервера. CGI это файл.
Этот файл сидит и ждет на веб-сервере. Когда клиентский браузер отправляет запрос на веб-сервер для выполнения вашего файла CGI, веб-сервер запускает ваш файл CGI на сайте сервера. Входные данные для этой программы CGI, если таковые имеются, взяты из клиентского браузера. Выходы этой программы CGI отправляются в браузер.
На каком языке вы пишете CGI-программу? Другие посты уже упоминали c, java, php, perl и т. Д.
источник
Идея, лежащая в основе CGI, заключается в том, что программа / скрипт (будь то Perl или даже C) получает ввод через
STDIN
(данные запроса) и выводит данные черезSTDOUT
(эхо,printf
операторы).Причина, по которой большинство PHP- скриптов не соответствуют требованиям, заключается в том, что они запускаются под модулем PHP Apache.
источник