1. Common
Универсальный, является отличительной чертой. Хотя мы слышали о сервлетах Java, WSGI Python. Но на самом деле и Java, и Python поддерживают CGI, и не только это, но и большинство других языков, которые мы хорошо знаем. Теоретически любой язык программирования, который поддерживает стандартный вывод и поддерживает получение переменных среды, может использоваться для написания программ CGI.
После рождения HTML, с развитием сетевых масштабов, динамические веб-сайты стали главной привлекательностью для людей. В то время появилась компьютерная графика. Первые версии CGI состояли из сценариев, написанных на языке Perl, поэтому их часто называют «сценариями CGI». По сей день добавление слова CGI в окно поиска Google дает кучу контента, связанного с Perl.
На самом деле скрипт (сценарий) не обязательно написан на скриптовом языке. Скрипты описывают характеристики класса программ: для выполнения задачи программа реализует комбинацию пакетного выполнения набора часто используемых логических операций. Любая программа, отвечающая этой характеристике, может называться сценарием. Конечно, сегодня программы, написанные на скриптовых языках, можно назвать скриптовыми программами, и их внутренняя логика давно стала не простой.
В наши дни древнее колдовство Perl давно выпало из поля зрения людей, хотя CGI и является распространенной технологией, на деле до сих пор используется, наверное, только C/C++.
2. Gateway
шлюз, не любопытствуйте, не сомневайтесь. Откройте любую книгу по HTTP, и там будет упомянуто понятие шлюза. Обычно слово шлюз является скорее понятием на аппаратном уровне, но на самом деле оно также совпадает со значением слова шлюз CGI. Не будет преувеличением назвать CGI программным шлюзом.
Ворота, более образно называемые "Транслятор протокола". Обычно для связи с входным и выходным концами шлюза используются разные протоколы. То есть, одна сторона - это протокол HTTP, а другая сторона может быть другими протоколами, такими как настраиваемые протоколы внутри предприятия. Это чехол для программ CGI.
(долго рисовал)
Программы CGI обычно развертываются на веб-сервере (например, Apache), а затем веб-сервер вызывает программу CGI.Чтобы узнать, как программа CGI получает входные данные с веб-сервера, читайте следующий раздел Интерфейс.
Обратите внимание на различие между веб-сервером и фоновым сервером.
3. Interface
Interface: Ну давай же. Еще одно слово, испорченное китайским переводом. I API (интерфейс прикладного программирования) — это то, что переводится как «интерфейс». I UI (пользовательский интерфейс) — это тоже он, переводится как «интерфейс». На самом деле они означают одно и то же. Я предпочитаю термин «интерфейс».
3.1 Протокол интерфейса
интерфейс, если быть точным, "протокол интерфейса", студенты, знакомые с сетью, должны понимать, что "протокол«Что это такое? Так называемое соглашение — это набор правил, с которыми соглашаются и соблюдают обе стороны или стороны в общении. на полосе и вне полосы.Только если люди всей страны будут соблюдать это правило,проблем с дорожным движением не будет.Хаос.На самом деле нормально ли останавливаться на зеленый свет,останавливаться на красный свет или продолжать движение слева при въезде и выезде с полосы?Конечно, в Великобритании и Японии все ездят по левой стороне.консенсусОчень важно.
Чтобы дать несколько каштанов 🌰: Для двоичных протоколов, таких как TCP / IP, описание содержимого протокола — это то, что представляет собой определенный байт, каков его диапазон значений и каковы значения различных значений. Протокол HTTP является символьным протоколом.Описание содержимого этого протокола: что такое первая строка, что такое вторая строка..., какое слово должно появиться и что оно означает.
На самом деле, будь то TCP/IP или HTTP, их все вместе можно назвать «сетевыми протоколами».Протокол, подробно описывающий семантику содержимого сообщения.«Протокол интерфейса» не имеет значения, он не определяет, какие байты перезаписываются, а также не определяет спецификацию содержимого символов. CGI фактически построен поверх протокола HTTP. То, что он описывает,Другое измерение критериев консенсуса.
3.2 Вход, выход
Просмотрите рисунок в предыдущем разделе. Веб-сервер получает HTTP-запрос от браузера пользователя, например запрос следующего URL-адреса:
http://guodongxiaren.me/cgi-bin/helloworld.cgi
В это время, прежде чем веб-сервер вызовет helloworld.cgi, информация в различных HTTP-запросах отправляется напеременная средыспособ записи в ОС. CGI-программа по сути представляет собой обычную исполняемую программу на ОС, которая получает переменные окружения через библиотечные функции самого языка, тем самым получая входные данные.
Помимо переменных окружения, CGI-программы могут получать данные еще одним способом:Стандартный ввод (stdin). Если сообщение запрашивает URL-адрес CGI, то данные POST, CGI получаются через стандартный ввод.
И как CGI создает данные (например, HTML-страницы) и возвращает их в браузер? Фактически самой CGI нужно только записывать данные в стандартный вывод. Например, printf, cout, например, System.out.println, например, print, echo и так далее. Поскольку веб-сервер выполнил перенаправление, перенаправьте стандартный вывод в сокет веб-сервера, подключенного к браузеру.
На этом этапе следует отметить, что не думайте, что возвращая HTML-страницу, можно напрямую вывести фрагмент HTML-кода, обратите внимание. В настоящее время вывод CGI отвечает за ответную часть протокола HTTP, поэтому заголовок ответа HTTP также должен выводиться по собственному стандарту. Например:
cout<<"Content-Type:text/html\n\n"<<endl;
Обратите внимание, что в конце есть две новые строки. Не спрашивайте, почему. Потому что сам протокол HTTP является символьным протоколом. Требуется пустая строка, чтобы различать, где находится заголовок, а где сущность. После двух новых строк (т.е. пустой строки) вы можете успешно вывести HTML (т.е. часть объекта). Учащиеся, знакомые с PHP, должны повторить HTML-код, да, он очень похож.
Хотя написание CGI веб-программ кажется очень громоздким для разбора и сборки, на самом деле существует множество сторонних пакетов для упрощения этих операций.Стандартные библиотеки языков высокого уровня в основном упакованы, и есть хороший сначала для C++ Трехсторонняя библиотека Cgicc.
4. Травма
Поскольку существует так много готовых библиотек для инкапсуляции, разумно использовать CGI для написания Web. вообще-то нет,Это потому, что CGI имеет большой недостаток:
Каждый раз, когда HTTP запрашивает CGI, веб-сервер запускает новый процесс для выполнения CGI-программы, т. е. разветвления и выполнения с характеристиками Unix. Когда количество пользовательских запросов велико, эта операция «разветвление и выполнение» серьезно снизит производительность веб-сервера.
Время рождает героев, и появилась технология FastCGI (сокращенно FCGI). Проще говоря, его суть заключается в технологии пула процессов, который находится в памяти.Планировщик отвечает за отправку переданного CGI-запроса процессу-обработчику, который обрабатывает CGI для обработки. После обработки запроса процесс обработки не уничтожается и продолжает ожидать поступления следующего запроса.
Конечно, FCGI на самом деле не является шокирующей идеей, и легко придумать решение.Пул ресурсов — это обычная процедура оптимизации производительности в фоновом режиме.. Технология сервлетов, изобретенная Java, также является технологией связи с резидентным шлюзом памяти, но она использует многопоточность вместо процессов.
5. Другие споры
Программа CGI имеет серьезный недостаток и не имеет функции маршрутизации URL-адресов.По сути, CGI предоставляется внешнему миру независимо, а CGI является независимой исполняемой программой. Поэтому ** не только URL-адрес CGI уродлив, но и легко раскрыть реальный путь **.
CGI обычно выполняет маршрутизацию только верхнего каталога, и это может быть передано только веб-серверу для настройки. Например:http://app/hello.cgiРасположение каталога приложения в физической ОС можно настроить через Apache. Хотя теоретически CGI-программы тоже можно реализоватьhttp://app/hello.cgi/abc/def Это форма маршрутизации. Но в основном никто не делает.
6. Исторический обзор
Мы знаем, что CGI может напрямую отображать веб-страницу в формате html, а также может выполнять различные вычисления и задачи логической обработки. Однако с развитием различных веб-интерфейсных и серверных технологий, а также с появлением все большего количества сценариев использования серверов с большими данными и высокой степенью параллелизма. Современное использование CGI меняется. Все больше и больше задач переносится с серверной части на внешнюю, а страницы внешнего интерфейса используют преимущества мощного JS, чтобы брать на себя больше ответственности.
CGI, как правило, больше не используется для прямого возврата html-страниц и в то же время передает сложные вычисления и задачи ввода-вывода на серверную часть (серверная часть может выполнять дальнейшую маршрутизацию и пересылку для достижения балансировки нагрузки). Сделайте CGI промежуточным слоем между передним и задним концами. В то время функция компьютерной графики заключалась в том, чтобы завершить основныеАутентификациятак же какобмен данными.
Появление API в стиле Restful позволило CGI выигратьпродление жизни. CGI анализирует внешний запрос и перенаправляет его на соответствующий внутренний сервер, затем извлекает данные из внутреннего интерфейса и возвращает XML или JSON во внешний интерфейс. Затем интерфейсный JS использует данные в формате XML/JSON для его заполнения. Вы можете нарисовать богатый интерфейс или использовать его для других целей. JS может использовать технологию Ajax для инициирования запросов данных к фоновому CGI. Что Ajax выполняет, так это загружает внутренние данные (например, выборку из базы данных) без необходимости обновления всей страницы.
Конечно, академическое определение Restful редко строго соблюдается в практических инженерных приложениях, например, ресурсы URL используют существительные, а затем используют различные методы HTTP (GET, POST, PUT, DELETE и т. д.) для выражения глаголов.
В дополнение к FCGI существует SCGI (Simple CGI), который также производится как альтернативный протокол CGI, но больше похож на FCGI.Кроме того, SCGI закрывает HTTP-соединение сразу после завершения каждого HTTP-ответа, что является немного Чжан Сяолун"закончиться"значение. Этот простой протокол больше соответствует потребностям концепции Restful API. Но он не очень известен.
7. Все дхармы возвращаются в секту
CGI - это три слова, я лично думаю, что основная точка находится на G (Шлюз, шлюз). Поняв основы CGI, вы найдете аналогичные концепции в других языках, таких как Servlet, WSGI. На самом деле все эти концепции произошли от CGI, но они завершили свою собственную эволюцию. Последующие столбцы познакомят вас с сервлетами, WSGI и многим другим.
Рекомендуемое чтение
Письмо больше похоже на поток сознания из-за ограниченного времени после работы. Поэтому, чтобы узнать об API и деталях программирования CGI, вы можете прочитать статью, которую я написал на CSDN во время учебы в колледже.Древняя компьютерная графика и веб-разработка". Конечно,Содержание на самом деле не полное, изначально планировалось написать серию, но она так и не была закончена. .Надеюсь, что эта колонка сможет придерживаться этого 😋.