Что такое Common Gateway Interface (CGI)? - PullRequest
719 голосов
/ 19 января 2010

CGI - это интерфейс общего шлюза. Как следует из названия, это «общий» интерфейс шлюза для всего. Это так тривиально и наивно от названия. Я чувствую, что понял это, и чувствовал это каждый раз, когда сталкивался с этим словом. Но, честно говоря, я этого не сделал. Я все еще в замешательстве.

Я программист PHP с опытом веб-разработки.

запрос пользователя (клиента) на страницу ---> веб-сервер (-> встроенный PHP интерпретатор) ----> Серверная часть (PHP) Script ---> 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 Программирование на C , меня очень смущает. " в C " ?? Шутки в сторону?? Я не знаю, что сказать. Я просто запутался. " в C " ?? Это меняет все. Программа должна быть скомпилирована и выполнена. Это полностью меняет мой взгляд на веб-программирование. Когда я собираю? Как выполняется программа (потому что это будет машинный код, поэтому он должен выполняться как самостоятельный процесс). Как это общается с веб-сервером? IPC? и взаимодействие со всеми серверами (в моем примере MATLAB & MySQL) с помощью программирования сокетов? Я потерялся !!

  • Люди говорят, что CGI устарела и больше не используется. Это так? Какое последнее обновление?

Однажды я столкнулся с ситуацией, когда я должен был дать доступ HTTP PUT запрос к веб-сервер (Apache HTTPD). Это долго назад. Итак, насколько я помню, это что я сделал:

  1. Отредактировал файл конфигурации Apache HTTPD, чтобы указать веб-серверу пройти все запросы HTTP PUT для некоторых put.php (мне пришлось написать этот PHP скрипт)

  2. Реализовать put.php для обработки запроса (сохранить файл в папке упоминается)

Люди говорили, что я написал CGI Script. Серьезно, я понятия не имел, что они говорили о.

  • Я действительно написал CGI Script?

Надеюсь, вы поняли, в чем заключается мое замешательство. (Потому что я сам не знаю, где я запутался). Я прошу вас, ребята, сделать ваш ответ максимально простым. Я действительно не могу понять любую причудливую техническую терминологию. По крайней мере, в этом случае.

EDIT:

Я нашел этот удивительный урок "CGI Programming Simple!" - CGI Tutorial , который объясняет понятия самым простым возможным способом. После прочтения этой статьи вы можете прочитать Начало работы с CGI-программированием на C , чтобы дополнить свое понимание реальными примерами кода. Я также добавил эти ссылки к этому руководству в статью Википедии: http://en.wikipedia.org/wiki/Common_Gateway_Interface

Ответы [ 12 ]

414 голосов
/ 19 января 2010

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-bin/*.cgi? Что с этим? Я не знаю, для чего этот каталог cgi-bin на сервере. Я не знаю, почему у них есть расширения * .cgi.

Это традиционное место для программ cgi, многие веб-серверы поставляются с этим каталогом, предварительно настроенным для выполнения всех двоичных файлов в качестве программ CGI. Расширение .cgi обозначает исполняемый файл, который должен работать через CGI.

Почему Perl всегда мешает. CGI & Perl (язык). Я также не знаю, что случилось с этими двумя. Почти все время я продолжаю слышать эти два в сочетании "CGI & Perl". Эта книга является еще одним отличным примером программирования CGI с использованием Perl. Почему бы не "Программирование CGI с помощью PHP / JSP / ASP" Я никогда не видел таких вещей.

Поскольку Perl является древним (старше, чем PHP, JSP и ASP, которые возникли, когда CGI был уже старым, Perl существовал, когда CGI был новым), и стал довольно известным как очень хороший язык для обслуживания динамических веб-страниц через CGI. , В настоящее время существуют другие альтернативы для запуска Perl в веб-сервере, в основном mod_perl .

CGI Программирование на C это меня сильно смущает. в C ?? Шутки в сторону?? Я не знаю, что сказать. Я просто в замешательстве. "В C" ?? Это меняет все. Программа должна быть скомпилирована и выполнена. Это полностью меняет мой взгляд на веб-программирование. Когда я компилирую? Как программа выполняется (потому что это будет машинный код, поэтому он должен выполняться как независимый процесс.) Как он взаимодействует с веб-сервером? IPC? и взаимодействует со всеми серверами (в моем примере MATLAB & MySQL) с помощью программирования сокетов? Я заблудился !!

Вы компилируете исполняемый файл один раз, веб-сервер выполняет программу и передает данные в запросе программе и выводит полученный ответ. CGI указывает, что для каждого запроса будет запускаться один экземпляр программы. Вот почему CGI сегодня неэффективен и устарел.

Они говорят, что CGI устарела. Его больше нет в использовании. Это так? Какое его последнее обновление?

CGI по-прежнему используется, когда производительность не имеет первостепенного значения и требуются простые средства выполнения кода. Это неэффективно по ранее изложенным причинам, и существуют более современные средства для выполнения любой программы в веб-среде. В настоящее время самым известным является FastCGI .

63 голосов
/ 19 января 2010

Что такое CGI?

Средство, позволяющее веб-серверу получать данные из программы (например, не из файла).

В чем дело с /cgi-bin/*.cgi?

Ничего страшного. Это просто соглашение.

Я не знаю, для чего этот каталог cgi-bin на сервере. Я не знаю, почему у них есть расширения * .cgi.

Сервер должен знать, что делать с файлом (т. Е. Рассматривать его как программу, которую нужно выполнить, а не просто как файл). Наличие расширения .html говорит ему использовать тип содержимого text / html. Наличие расширения .cgi говорит ему, что нужно запускать его как программу.

Хранение исполняемых файлов в отдельном каталоге обеспечивает дополнительную защиту от выполнения некорректных файлов и / или обслуживания программ CGI в качестве необработанных данных в случае неправильной настройки сервера.

Почему Perl всегда мешает.

Это не так. Perl был просто большим и популярным одновременно с CGI.

Я не использовал Perl CGI в течение многих лет. Я долгое время использовал mod_perl, и в эти дни я склоняюсь к PSGI / Plack с FastCGI.

Эта книга является еще одним отличным примером программирования CGI с использованием Perl. Почему бы не "CGI Программирование с PHP / JSP / ASP".

CGI не очень эффективен. Лучшие методы общения с программами с веб-серверов появились примерно в то же время, что и PHP. JSP и ASP - это разные способы общения с программами.

CGI Программирование на C это меня сильно смущает. в C ?? Серьезно ??

Это язык программирования, почему бы и нет?

Когда я собираю?

  1. Введите код
  2. URL доступа
  3. Веб-сервер запускает программу

Как выполняется программа (потому что это будет машинный код, поэтому он должен выполняться как независимый процесс).

Он не должен выполняться как самостоятельный процесс (вы можете писать модули Apache на C), но вся концепция CGI заключается в том, что он запускает внешний процесс.

Как он взаимодействует с веб-сервером? IPC?

STDIN / STDOUT и переменные среды - как определено в спецификации CGI.

и взаимодействие со всеми серверами (в моем примере MATLAB & MySQL) с использованием сокета программирование?

Использование любых методов, которые вам нравятся и поддерживаются.

Говорят, что CGI обесценивается. Его больше нет в использовании. Это так?

CGI неэффективен, медленен и прост. Это редко используется, когда это используется, это потому, что это просто. Если производительность не имеет большого значения, простота того стоит.

Какое его последнее обновление?

1,1

41 голосов
/ 19 января 2010

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-интерфейсом.

18 голосов
/ 19 января 2010

CGI указан в RFC 3875 , хотя это более поздняя «официальная» кодификация исходного документа NCSA . По сути, CGI определяет протокол для передачи данных о HTTP-запросе от веб-сервера в программу для обработки - в любую программу на любом языке. На момент написания спецификации (1993 г.) большинство веб-серверов содержали только статические страницы, «веб-приложения» были редкой и новой вещью, поэтому казалось естественным отделить их от «нормального» статического содержимого, такого как в Каталог cgi-bin, кроме статического содержимого, и заканчивающийся на .cgi.

В то время здесь также не было выделенных «языков веб-программирования», таких как PHP, и C был доминирующим переносимым языком программирования - так много людей писали свои CGI-скрипты на C. Но Perl быстро оказался лучше подходящим такого рода вещи, и CGI на некоторое время стал почти синонимом Perl. Затем появились Java-сервлеты, PHP и многие другие, которые заняли большую часть рынка Perl.

13 голосов
/ 19 января 2010

Взгляните на CGI в Википедии. CGI - это протокол между веб-сервером и внешней программой или сценарий, который обрабатывает ввод и генерирует вывод, отправляемый в браузер.

CGI - это просто способ взаимодействия веб-сервера и программы, ни больше, ни меньше. Здесь сервер управляет сетевым соединением и протоколом HTTP, а программа обрабатывает ввод и генерирует вывод, который отправляется в браузер. Сценарий CGI может быть в основном любой программой, которая может выполняться веб-сервером и следует протоколу CGI. Таким образом, CGI-программа может быть реализована, например, на C. Однако это крайне редко, поскольку C не очень хорошо подходит для этой задачи.

/cgi-bin/*.cgi - это просто путь, на котором люди обычно ставят свой CGI-скрипт. По умолчанию веб-сервер обычно настроен на получение сценариев CGI по этому пути.

CGI-скрипт может быть реализован также на PHP, но все PHP-программы не являются CGI-скриптами. Если в веб-сервер встроен интерпретатор PHP (например, mod_php в Apache), то этап CGI пропускается посредством более эффективного прямого протокола между веб-сервером и интерпретатором.

Вне зависимости от того, реализовали ли вы сценарий CGI или нет, зависит от того, как ваш сценарий выполняется веб-сервером.

12 голосов
/ 19 января 2010

CGI, по сути, передает запрос любому интерпретатору, настроенному на веб-сервере - это может быть Perl, Python, PHP, Ruby, C почти что угодно.Perl был самым распространенным в те дни, поэтому вы часто видите его в отношении CGI.

CGI не умер.На самом деле большинство крупных хостинговых компаний используют PHP как CGI, а не mod_php, потому что он предлагает конфигурацию на уровне пользователя и некоторые другие вещи, в то время как он медленнее, чем mod_php.Ruby и Python также обычно запускаются как CGI.Ключевым отличием здесь является то, что серверный модуль работает как часть реального серверного программного обеспечения - где, как и в случае CGI, он полностью находится за пределами сервера. Сервер просто использует модуль CGI, чтобы определить, как передавать и получать данные внешнему интерпретатору.

11 голосов
/ 19 января 2010

CGI - это механизм, посредством которого веб-сервер вызывает внешнюю программу для обработки запроса, при этом переменные среды и стандартный ввод используются для подачи данных запроса в программу. Точный язык, на котором написана внешняя программа, не имеет значения, хотя легче писать программы на CGI на некоторых языках, чем на других.

Поскольку для сценариев CGI требуются разрешения на выполнение, httpd по умолчанию позволяет запускать только программы CGI в каталоге cgi-bin в целях безопасности (возможно, теперь ошибочных).

Большинство PHP-скриптов запускаются в процессе веб-сервера через mod_php. Это не CGI.

CGI работает медленно, так как программа (и связанный с ней интерпретатор) должны запускаться по запросу. Современные альтернативы - встроенное выполнение, используемое mod_php, и длительные процессы, используемые FastCGI. У данного языка может быть свой способ реализации этих механизмов, поэтому обязательно поспрашивайте, прежде чем прибегнуть к CGI.

7 голосов
/ 21 января 2017

CGI-скрипт - это консоль / оболочка.В Windows, когда вы используете окно «Командная строка», вы запускаете консольные программы.Когда веб-сервер выполняет сценарий CGI, он обеспечивает ввод в консоль / оболочку с использованием переменных среды или «стандартного ввода».Стандартный ввод подобен вводу данных в консоль / оболочку;в случае сценария CGI веб-сервер выполняет набор текста.Сценарий CGI записывает данные в «стандартный вывод», и этот вывод отправляется клиенту (веб-браузеру) в виде HTML-страницы.Стандартный вывод аналогичен выводу, который вы видите в программе консоли / оболочки, за исключением того, что веб-сервер читает и отправляет его.

CGI-сценарий может быть выполнен из браузера.URI обычно включает строку запроса, которая предоставляется сценарию CGI.Если метод «get», то строка запроса передается в CGI Script в переменной среды с именем QUERY_STRING.Если метод «post», тогда строка запроса передается в CGI-скрипт с использованием стандартного ввода (CGI-скрипт считывает строку запроса из стандартного ввода).

Раннее использование CGI-скриптов было для обработки форм.В начале HTML-формы HTML обычно имели атрибут «действие» и кнопку, обозначенную как кнопка «отправить».При нажатии кнопки отправки URI, указанный в атрибуте «action», будет отправлен на сервер с данными из формы, отправленными в виде строки запроса.Если в «действии» указан сценарий CGI, то сценарий CGI будет выполнен, а затем он создаст страницу HTML.

RFC 3875 «Общий интерфейс шлюза (CGI)» частично определяет CGI с использованием C, как сказаночто переменные окружения "доступны из подпрограммы библиотеки C getenv () или переменной environment".

Если вы разрабатываете сценарий CGI с использованием C / C ++ и используете для этого Microsoft Visual Studio, то вы должны разработать консольпрограмма.

7 голосов
/ 21 апреля 2014

Пример из реальной жизни: сложная база данных, которую необходимо показать на веб-сайте.Поскольку база данных была разработана где-то в 1986 году (!), Множество данных было упаковано различными способами для экономии места на диске.

По мере развития разработчики больше не могли решать сложные запросы данных только в SQL, например, из-за необычных алгоритмов сортировки.

Существует три разумных решения:

  1. быстро и грязно: отправьте несортированные данные в PHP, отсортируйте их там.Очевидно, это очень дорогое решение, потому что это будет повторяться каждый раз, когда страница называется
  2. , написать плагин для механизма базы данных - но администратор не был готов разрешить запуск чужого кода на своем сервере, или
  3. Вы можете обрабатывать данные в программе (C, Perl и т. Д.) И выводить HTML.Сама программа входит в / cgi-bin и вызывается веб-сервером (например, Apache) напрямую, а не через PHP.

CGI запускает ваш скрипт в Solution # 3 и выводит эффект в браузер.У вас есть скорость скомпилированной программы, гибкость языка лучше, чем SQL, и вам не нужно писать плагины для SQL-сервера.(Опять же, это пример, специфичный для SQL и C)

7 голосов
/ 17 февраля 2010

Возможно, вы хотите знать, что не является CGI, и ответом является МОДУЛЬ для вашего веб-сервера (если я полагаю, что вы используете Apache). И это большая разница, потому что CGI нужна и внешняя программа, поток, что угодно для создания экземпляра сервера приложений PERL, PHP, C, где при запуске в качестве МОДУЛЯ эта программа сама является веб-сервером (apache).

Из-за всего этого возникает множество проблем с производительностью, безопасностью и переносимостью. Но хорошо сначала узнать, что не является CGI, понять, что это такое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...