Как стать автором
Обновить

Всё, что вы хотели знать о CLI, CGI, MOD, но стеснялись спросить

Время на прочтение3 мин
Количество просмотров17K
… Я знаю кун-фу, каратэ, таэквондо и еще много страшных слов!
(с) анекдот



Меня начинающие админы последнее время стали часто спрашивать «А чем отличаются пакеты php-cgi, php-cli и mod_php? И почему, например, для Python есть mod_python, но нет python-cgi?»
Сначала было смешно, но потом стало ясно, что сей вопрос хоть раз да возникал у каждого, кто занимается администрированием LAMP(ссылка) и подобных серверов.
Статья написана по мотивам моей беседы с felvis, поэтому заранее извиняюсь за некоторую вольность изложения.

Пару слов о процессах


У каждого запущенного в системе процесса есть такая фигня, как окружение — environment — которое описывается переменными окружения. В Linux-подобных ситемах c установленным пакетом coreutils своё окружение можно посмотреть командой env. Окружение произвольного процесса можно посмотреть через специальную файловую системы /proc:
cat /proc/$PID/environ (где $PID - идентификатор процесса в системе).

Ещё пример, вместо команды env можно выполнить
cat /proc/self/environ

Увидите то же самое, только в менее удобочитаемом виде :)
Всё, теперь то что нам нужно для понимания отличий CGI и CLI мы знаем. Идём далее.

Буквы, буквы


Для PHP имеем в системе следующие пакеты: mod_php, php-cgi и php_cli.
В чём разница?
mod_php — so-шка, которая дополнительно подтягивается при старте Апача. При обращении к php-скрипту из браузера скрипты выполняются с окружением процесса httpd.
php-cgi — дополнительно при старте Апача ничего не подтягивается и каждый раз при вызове
http://www.domain.com/script.php
правильно настроеный веб-сервер дёргает /usr/bin/php-cgi /path/to/script.php, форкается новый процесс и скрипт выполняется уже в окружении php-cgi (которое может сильно отличаться от окружения процесса httpd).
Общего у mod_php и php-cgi — то, что вызываются они веб-сервером.
Разное — то, что скрипты выполняются в разном окружении (например, можно настроить php-cgi так, что у него не будет доступа к определённым диреториям в системе, или вообще все скрипты пускались в чруте — вариантов море. Кстати, в общем случае php-cgi — более секьюрный способ обработки php-скриптов).
php-cli — этот бинарь в общем случае вызывается непосредственно юзером, когда есть необходимость выполнить php-скрипт из консоли. Соответственно окружение в котором скрипт выполняется — юзерское (то, которое через env видно).
Попробуйте выполнить такой скрипт из консоли и через браузер:
<?php print $_ENV['PWD'] ?>

* This source code was highlighted with Source Code Highlighter.

поймёте, что имеется ввиду.

Кстати, именно из-за вышеописанного один и тот же скрипт будет работать по-разному из консоли и через браузер. Разработчик, будь внимателен при отладке!

Немного про пакеты


Теперь за Python. Почему есть mod_python, но нет python-cgi и python-cli?
Тут всё просто, проведём аналогию:
mod_php -> mod_python
php-cli -> /usr/bin/python
php-cgi - python с mod_cgi

Нужно отдельно пояснить, что CGI — это Common Gateway Interface для веб-серверов (не только Апача). То есть CGI — это лишь технология, с помощью которой можно выполнять что угодно, любые бинари, которые формируют веб-страницу (хоть программы на Си писаные — пофиг). В Апаче эту технологию реализует mod_cgi — через этот модуль Апач дёргает скрипт, в котором прописан shebang #!/usr/bin/python или #!/usr/bin/php и тд — и скрипт выполняется.
Основной недостаток mod_cgi — скорость выполнения скриптов, потому-то и пишут отдельные модули для Апача, которые интепретитруют PHP, Python, shell-скрипты — так быстрее.
Конечно есть mod_fcgi, который сильно быстрее mod_cgi — но описание mod_fcgi не входит в рамки этой статьи.
_________
Текст подготовлен в ХабраРедакторе
В тексте использована картинка Binary от Brian «Visual Paradox» Kissinger.
Теги:
Хабы:
+1
Комментарии2

Публикации

Изменить настройки темы

Истории

Работа

Ближайшие события