Основные отличия от остальных реализаций SAPI
Основные отличия CLI SAPI от остальных реализаций SAPI:
-
В отличие от CGI SAPI, заголовки не пишутся в поток вывода.
Несмотря на то, что в CGI SAPI есть способ подавления HTTP-заголовков, в CLI SAPI нет возможности их включить.
CLI по умолчанию запускается в тихом режиме, тем не менее, ключи -q и --no-header сохранены для обратной совместимости, что позволяет использовать старые CGI-скрипты.
Текущая директория не изменяется на рабочую директорию скрипта. (Ключи -C и --no-chdir сохранены для обратной совместимости)
Сообщения об ошибках выдаются в текстовом режиме (без HTML-форматирования).
-
Некоторые настройки php.ini переопределяются CLI SAPI, поскольку они не имеют смысла при работе в командной строке:
Переопределяемые директивы php.ini Директива Значение по умолчанию в CLI SAPI Комментарий html_errors false
По умолчанию false
, т.к. бывает достаточно сложно читать в консоли сообщения об ошибке, когда они наполнены бессмысленными HTML-тегами.implicit_flush true
Обычно в консоли желательно отображать вывод, например, из print, echo и других, сразу же минуя буфер. Тем не менее, по-прежнему можно использовать буферизацию вывода для отложенного вывода или манипуляций с ним. max_execution_time 0 (без ограничений) PHP, выполняемый в консоли, как правило, используется для более широкого диапазона задач, чем обычные веб-скрипты. И так как они могут выполняться очень долго, то максимальное время выполнения неограничено. register_argc_argv true
Установка этой опции в значение
true
означает, что скрипты запускаемые через CLI SAPI всегда имеют доступ к argc (количество аргументов, переданных приложению) и argv (массив текущих аргументов).При использовании CLI SAPI переменные $argc и $argv автоматически заполняются соответствующими значениями. Эти значения можно также найти в массиве $_SERVER, например: $_SERVER['argv'].
output_buffering false
Несмотря на то, что эта опция php.ini жестко установлена в
false
, функции буферизации вывода все еще доступны.max_input_time false
PHP CLI не поддерживает GET, POST или загрузку файлов.
Замечание:
Эти директивы не могут быть инициализированы другими значениями из конфигурационного файла php.ini или любого другого (в случае, если он указан). Это ограничение связано с тем, что значения применяются после обработки конфигурационных файлов. Тем не менее, эти значения могут быть изменены во время работы скрипта (хотя это не имеет особого смысла для всех них, например register_argc_argv).
Замечание:
Рекомендуется установить опцию ignore_user_abort для скриптов, используемых из командной строки. За подробностями обращайтесь к функции ignore_user_abort().
-
Для облегчения работы в окружении оболочки было определено некоторое количество констант для потоков ввода/вывода.
-
CLI SAPI не изменяет текущую директорию на директорию исполняемого скрипта.
Пример #1 Пример, демонстрирующий разницу с CGI SAPI:
<?php
// Простейший тестовый скрипт под названием test.php
echo getcwd(), "\n";
?>В случае, если используется CGI-версия, результат работы будет следующим:
$ pwd /tmp $ php -q another_directory/test.php /tmp/another_directory
Это наглядно демонстрирует, что PHP изменяет текущую директорию на директорию исполняемого скрипта.
Использование CLI SAPI дает другой результат:
$ pwd /tmp $ php -f another_directory/test.php /tmp
Это обеспечивает большую гибкость при написании консольных скриптов на PHP.
Замечание:
CGI SAPI позволяет получить аналогичное CLI SAPI поведение в случае использования ключа -C при запуске из командной строки.