Чем отличается CGI от FastCGI зачем они нужны и как понять что мы используем CGI или FastCGI, когда обычно применяется, ответы на эти вопросы меня очень интересуют. К поисковику ходил но кроме расплывчатых объяснений ничего не нашел. Объясните пожалуйста чайнику.
Чтобы понять что используешь, посмотри как ты подключил PHP к WebServer. CGI можно использовать если нужно поддерживать старые версии PHP. Про FastCGI нормально написано даже в википедии, он улучшенная версия CGI. Они нужны чтобы одна программа могла общаться с другой программой, в нашем случаи веб-сервер(nginx,apache) и интерпретатор(PHP-FPM, HHVM).
https://ru.wikipedia.org/wiki/FastCGI https://ru.wikipedia.org/wiki/CGI и http://www.cyberforum.ru/apache/thread396784.html
Устаревшие функции становятся доступны? Не ясно о какой старости идет речь и в чем заключается поддержка, можете объяснить? MiksIr выходит выполнение cgi отличается от "php как модуль веб сервера" тем что первый работает точно так же но не как модуль веб сервера и это все отличие? Я правильно понял?
Смотря что подразумевать под "работает точно так же". Отличий много, и в общем про них в вики написано, но может для вас они незначительные.
http://php.net/supported-versions.php http://php.net/manual/ru/migration56.html p.s. не в тему, но про устаревшие функции и версии.
MiksIr Перечитал википедию ещё раз, но снова не ясно. https://ru.wikipedia.org/wiki/CGI Внешнюю программу в этой трактовке можно считать за браузер? Во втором предложении сказано что CGI программа может работать как модуль веб сервера(совместно с веб сервером, думаю имеется ввиду одно и тоже) в то время как в ссылке которую вы дали на php sapi, cgi и php как модуль веб сервера отмечены разными пунктами и получается что это разные вещи. А в статье без php которая только про cgi отчасти трактуется это как одно и то же. Подскажите пожалуйста где найти описание интерфейса? Статья вроде про этот интерфейс а его описания в ней нет. Есть ли где нибудь нормальное описание всего этого?
Нет, в этой трактовке внешняя программа - это PHP бинарник php-cgi Нет, разное. Модуль веб-сервера - это то, что выполняется внутри процесса веб-сервера. CGI - это взаимодействие между процессом веб-сервера и процессом PHP. "процесс" - это ключ к понимаю. \ По большей части оно вам не нужно на самом деле, это описание. Но можете почитать английскую версию статьи про CGI - она много полнее.
MiksIr Спасибо, прочитал на английском. Если в двух словах там говорится что некоторая программа может отправить запрос на веб сервер и получить ответ. Когда программа умеющая работать со стандартными потоками ввода и вывода выполняет запрос к веб серверу независимо откуда(браузер, командная строка и не важно работает ли скрипт как модуль веб сервера или он самостоятельный) и получает от него ответ это и есть понятие CGI? То есть взаимодействие некоторой программы с веб сервером?
Угу, только наоборот - веб сервер тут выступает инициатором и делает запрос к программе. А поскольку программу кто-то должен запустить - до вебсервер делает и это. По сути да, просто. Запуск какой-то программы веб-сервером простым exec-ом c установленными переменными окружения (часть из них описана в стандарте), подача тела POST в снандартный вход (если post конечно), и чтение тела ответа на стандартном выводе.
MiksIr Спасибо вам большое. Понимание немного пришло. Извиняюсь, но созрели новые вопросы, прошу вашей помощи. Вы писали Если вернуться к вашим словам о том, что когда php установлен как модуль веб сервера то процесс php работает внутри процесса веб сервера, тогда если php не модуль веб сервера, то он имеет свой независимый от веб сервера процесс(запуск которого инициирует веб сервер) можно сделать вывод, что CGI это взаимодействие между процессом веб-сервера и самостоятельным процессом php когда php не является модулем веб сервера. Тогда как apache узнает что нужно запустить бинарник php-cgi, вызвать нужный php скрипт если php не является его модулем? apache же в этом случае о php ничего не знает. а если знает(интересно как) тогда в чем смысл устанавливать php как модуль apache если веб сервер и без этого знает про php? может я плохо понимаю как устроены веб сервера?
Ну это описывается в конфиге апача. Как правило по расширению файла - если запрашивается файл с .php на конце - то запускать указанный в конфиге бинарник Код (Text): ScriptAlias /local-bin /usr/local/bin AddHandler application/x-httpd-php5 php Action application/x-httpd-php5 /local-bin/php-cgi
MiksIr Выходит ситуация следующая -> Если php не установлен как модуль apache и все же нужно что бы он все же мог вызывать php, веб сервер настраивается соответствующим образом для того что бы он знал кого вызывать через cgi интерфейс для определенного типа запросов, тогда какой смысл устанавливать php как модуль веб сервера если можно просто запускать его как cgi? зачем придумали два способа? догадываюсь что cgi подход появился ранее но до сих пор остался как фича и у него урезанные возможности и на смену ему пришел подход установки php как модуль веб сервера. Если я прав, то где можно почитать про отличительные особенности? Или все же я не прав?
В SAPI про PHP написано почему. exec нового процесса - очень тяжелая операция. А в CGI на каждый php скрипт нужно делать такой exec. Когда же пхп как модуль - он уже в памяти и по каждому новому запросу читает с диска php файл и исполняет его. PHP интерпретатор умеет исполнить скрипт, потом очистить в памяти свое состояние и исполнить новый скрипт. Это быстро. Но в случае cgi у него нет шансов это сделать ибо CGI сам по себе не подразумевает передачу нескольких запросов от веб-сервера в программу. По-этому приходится на каждый запрос заново загружать в память php интерпретатор, потом он инициализируется и только потом грузит скрипт php на исполнение. FastCGI как раз решает эту проблему - необходимость запускаться каждый раз на каждый запрос. FastCGI подразумевает, что запущенная один раз программа не умирает, а продолжает принимать запросы и исполнять их. Причем, запускать эту программу первый раз может как сам веб-сервер, так и вообще сторонние скрипты (например, стартап скрипты операционной системы) Добавлено спустя 1 минуту 55 секунд: Вот разницы между модулем вебсервера и fastcgi по производительности почти нет. Там, свои плюсы и минусы (ну, вернее, с приходом fpm куча плюсов у fastcgi и почти ни одного минуса, по-этому он так и популярен).
MiksIr Спасибо большое, человек. Теперь все прояснилось благодаря вашей помощи. Одно только не ясно, зачем нужно было придумывать бинарник php-cgi когда есть бинарник php успешно запускающийся через командную строку.
Ну потому что один умеет принимать post, читает определенные переменные окружения и определяет на их основе - какой скрипт загрузить, выдает content-type заголовок в ответе, оформляет всякие ошибки и прочее в html... а второй этого не делает, а просто исполняет указанный в командной строке скрипт В общем они похожи, но все же задачи разные.
Ну ведь можно было бы использовать только один, навороченный вариант бинарника в обоих случаях. Догадываюсь что это сделано в угоду производительности консольных скриптов. Всё, вопросов у меня больше не осталось! Ещё раз большое спасибо вам MiksIr!
Не, производительность там не страдает, скорее это просто удобство - всегда знаешь что для чего запускать. Можно было бы сделать один бинарник с каким-то ключиком для переключения режимов, ничего не поменялось бы - только нужно было бы помнить этот ключик и не забывать про него. В общем так повелось издревна и не самый плохой вариант unix way такой своеобразный (https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D0%BE%D1%8 ... D1%8F_UNIX - "Пишите программы, которые делают что-то одно и делают это хорошо.")