Что такое общий интерфейс шлюза (CGI)?


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

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

запрос пользователя (клиента) для страницы - - - > веб-сервер (- >встроенный PHP интерпретатор) - - - - > скрипт на стороне сервера(PHP) - - - > MySQL-сервер.

Теперь скажите, что мой PHP-скрипт может получать результаты с сервера MySQL server & MATLAB server & другого сервера.

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

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

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

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

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

люди сказали, что я написал сценарий CGI. Серьезно, я понятия не имел, что они о чем-то говорили.

  • я действительно писал Сценарий CGI?

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

EDIT:

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

12 703

12 ответов:

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

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

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

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

что такое 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 are различные методы для разговора с программами.

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

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

когда я скомпилировать?

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

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

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

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

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

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

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

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

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

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

1.1

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

Он описывает, как определенные свойства этого запроса должны быть переданы в среду этой программы и как программа должна передать ответ обратно на сервер и как сервер должен "завершить" ответ, чтобы сформировать действительный ответ на исходный HTTP-запрос.

некоторое время CGI был Интернет-проект IETF и как таковой имел срок годности. Он истек без обновления, поэтому не было "стандарта" CGI. Сейчас это информационный РФЦ, но как таковой документ обычная практика и не является стандартом сам по себе. 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.

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

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

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

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

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

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

вы, возможно, хотите знать, что не CGI, и ответ-это модуль для вашего веб-сервера (если я полагаю, что вы runnig Apache). И это большая разница, потому что CGI нуждается и во внешней программе, потоке, что угодно, чтобы создать экземпляр сервера приложений PERL, PHP, C, где при запуске в качестве модуля эта программа является веб-сервером (apache) per-se.

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

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

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

есть три разумных решения:

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

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

CGI-это программа (или веб-API), которую вы пишете и сохраняете на веб-сервере. CGI-это файл.

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

на каком языке вы пишете программу CGI? В других сообщениях уже упоминаются c, java, php, perl и т. д.

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

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

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

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

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

идея CGI заключается в том, что программа/скрипт (будь то Perl или даже C) получает входные данные через STDIN (данные запроса) и выводит данные через STDOUT (операторы echo, printf). Причина, по которой большинство PHP-скриптов не квалифицируются, заключается в том, что они выполняются под модулем PHP Apache.