За последние 24 часа нас посетил 62161 программист и 1800 роботов. Сейчас ищут 1413 программистов ...

CGI, FastCGI

Тема в разделе "PHP для новичков", создана пользователем pircul, 23 июн 2015.

  1. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Чем отличается CGI от FastCGI зачем они нужны и как понять что мы используем CGI или FastCGI, когда обычно применяется, ответы на эти вопросы меня очень интересуют. К поисковику ходил но кроме расплывчатых объяснений ничего не нашел. Объясните пожалуйста чайнику.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Чтобы понять что используешь, посмотри как ты подключил PHP к WebServer.
    CGI можно использовать если нужно поддерживать старые версии PHP.
    Про FastCGI нормально написано даже в википедии, он улучшенная версия CGI.

    Они нужны чтобы одна программа могла общаться с другой программой, в нашем случаи веб-сервер(nginx,apache) и интерпретатор(PHP-FPM, HHVM).
     
  3. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
  4. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Устаревшие функции становятся доступны? Не ясно о какой старости идет речь и в чем заключается поддержка, можете объяснить?

    MiksIr выходит выполнение cgi отличается от "php как модуль веб сервера" тем что первый работает точно так же но не как модуль веб сервера и это все отличие? Я правильно понял?
     
  5. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Смотря что подразумевать под "работает точно так же". Отличий много, и в общем про них в вики написано, но может для вас они незначительные.
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    http://php.net/supported-versions.php http://php.net/manual/ru/migration56.html
    p.s. не в тему, но про устаревшие функции и версии.
     
  7. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    MiksIr
    Перечитал википедию ещё раз, но снова не ясно. https://ru.wikipedia.org/wiki/CGI
    Внешнюю программу в этой трактовке можно считать за браузер? Во втором предложении сказано что CGI программа может работать как модуль веб сервера(совместно с веб сервером, думаю имеется ввиду одно и тоже) в то время как в ссылке которую вы дали на php sapi, cgi и php как модуль веб сервера отмечены разными пунктами и получается что это разные вещи. А в статье без php которая только про cgi отчасти трактуется это как одно и то же.
    Подскажите пожалуйста где найти описание интерфейса? Статья вроде про этот интерфейс а его описания в ней нет. Есть ли где нибудь нормальное описание всего этого?
     
  8. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Нет, в этой трактовке внешняя программа - это PHP бинарник php-cgi
    Нет, разное. Модуль веб-сервера - это то, что выполняется внутри процесса веб-сервера. CGI - это взаимодействие между процессом веб-сервера и процессом PHP. "процесс" - это ключ к понимаю.
    \
    По большей части оно вам не нужно на самом деле, это описание. Но можете почитать английскую версию статьи про CGI - она много полнее.
     
  9. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    MiksIr Спасибо, прочитал на английском. Если в двух словах там говорится что некоторая программа может отправить запрос на веб сервер и получить ответ.
    Когда программа умеющая работать со стандартными потоками ввода и вывода выполняет запрос к веб серверу независимо откуда(браузер, командная строка и не важно работает ли скрипт как модуль веб сервера или он самостоятельный) и получает от него ответ это и есть понятие CGI? То есть взаимодействие некоторой программы с веб сервером?
     
  10. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Угу, только наоборот - веб сервер тут выступает инициатором и делает запрос к программе. А поскольку программу кто-то должен запустить - до вебсервер делает и это.
    По сути да, просто. Запуск какой-то программы веб-сервером простым exec-ом c установленными переменными окружения (часть из них описана в стандарте), подача тела POST в снандартный вход (если post конечно), и чтение тела ответа на стандартном выводе.
     
  11. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    MiksIr Спасибо вам большое. Понимание немного пришло. Извиняюсь, но созрели новые вопросы, прошу вашей помощи.
    Вы писали
    Если вернуться к вашим словам о том, что когда php установлен как модуль веб сервера то процесс php работает внутри процесса веб сервера, тогда если php не модуль веб сервера, то он имеет свой независимый от веб сервера процесс(запуск которого инициирует веб сервер) можно сделать вывод, что CGI это взаимодействие между процессом веб-сервера и самостоятельным процессом php когда php не является модулем веб сервера. Тогда как apache узнает что нужно запустить бинарник php-cgi, вызвать нужный php скрипт если php не является его модулем? apache же в этом случае о php ничего не знает. а если знает(интересно как) тогда в чем смысл устанавливать php как модуль apache если веб сервер и без этого знает про php? может я плохо понимаю как устроены веб сервера?
     
  12. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ну это описывается в конфиге апача. Как правило по расширению файла - если запрашивается файл с .php на конце - то запускать указанный в конфиге бинарник
    Код (Text):
    1. ScriptAlias /local-bin /usr/local/bin
    2. AddHandler application/x-httpd-php5 php
    3. Action application/x-httpd-php5 /local-bin/php-cgi
     
  13. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    MiksIr
    Выходит ситуация следующая -> Если php не установлен как модуль apache и все же нужно что бы он все же мог вызывать php, веб сервер настраивается соответствующим образом для того что бы он знал кого вызывать через cgi интерфейс для определенного типа запросов, тогда какой смысл устанавливать php как модуль веб сервера если можно просто запускать его как cgi? зачем придумали два способа? догадываюсь что cgi подход появился ранее но до сих пор остался как фича и у него урезанные возможности и на смену ему пришел подход установки php как модуль веб сервера. Если я прав, то где можно почитать про отличительные особенности? Или все же я не прав? :)
     
  14. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    В SAPI про PHP написано почему. exec нового процесса - очень тяжелая операция. А в CGI на каждый php скрипт нужно делать такой exec.

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

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

    Добавлено спустя 1 минуту 55 секунд:
    Вот разницы между модулем вебсервера и fastcgi по производительности почти нет. Там, свои плюсы и минусы (ну, вернее, с приходом fpm куча плюсов у fastcgi и почти ни одного минуса, по-этому он так и популярен).
     
  15. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    MiksIr
    Спасибо большое, человек. Теперь все прояснилось благодаря вашей помощи. Одно только не ясно, зачем нужно было придумывать бинарник php-cgi когда есть бинарник php успешно запускающийся через командную строку.
     
  16. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ну потому что один умеет принимать post, читает определенные переменные окружения и определяет на их основе - какой скрипт загрузить, выдает content-type заголовок в ответе, оформляет всякие ошибки и прочее в html... а второй этого не делает, а просто исполняет указанный в командной строке скрипт ;) В общем они похожи, но все же задачи разные.
     
  17. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Ну ведь можно было бы использовать только один, навороченный вариант бинарника в обоих случаях. Догадываюсь что это сделано в угоду производительности консольных скриптов. Всё, вопросов у меня больше не осталось! Ещё раз большое спасибо вам MiksIr!
     
  18. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Не, производительность там не страдает, скорее это просто удобство - всегда знаешь что для чего запускать. Можно было бы сделать один бинарник с каким-то ключиком для переключения режимов, ничего не поменялось бы - только нужно было бы помнить этот ключик и не забывать про него. В общем так повелось издревна и не самый плохой вариант ;) unix way такой своеобразный (https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D0%BE%D1%8 ... D1%8F_UNIX - "Пишите программы, которые делают что-то одно и делают это хорошо.")