Основные отличия CLI SAPI от остальных реализаций SAPI:
В отличие от CGI SAPI, заголовки не пишутся в поток вывода.
Несмотря на то, что в CGI SAPI есть способ подавления HTTP-заголовков, в CLI SAPI нет возможности их включить.
CLI по умолчанию запускается в тихом режиме, тем не менее, ключи -q и --no-header сохранены для обратной совместимости, что позволяет использовать старые CGI-скрипты.
Текущая директория не изменяется на рабочую директорию скрипта. (Ключи -C и --no-chdir сохранены для обратной совместимости)
Сообщения об ошибках выдаются в текстовом режиме (без HTML-форматирования).
Некоторые настройки php.ini переопределены в CLI SAPI, поскольку они не имеют особого смысла при работе в командной строке:
Директива | Значение по умолчанию в CLI SAPI | Комментарий |
---|---|---|
html_errors | FALSE | Бывает достаточно сложно прочитать в консоли сообщение об ошибке, когда оно наполнено бессмысленными HTML-тегами, поэтому значение по умолчанию данной опции всегда FALSE. |
implicit_flush | TRUE | Желательно, чтобы любой вывод print(), echo(), а также аналогичных функций немедлено отправлялся в стандартный поток вывода, а не попадал в буфер. Вы все еще можете использовать буферизацию вывода, если хотите задержать или манипулировать стандартный вывод. |
max_execution_time | 0 (без ограничений) | Из-за неограниченных возможностей использования PHP в командной строке максимальное время выполнения скрипта не ограничено. В то время, как приложения, написанные для веб, выполняются достаточно быстро, консольные приложения могут выполняться в течении длительного времени. |
register_argc_argv | TRUE |
Благодаря значению TRUE этой опции, переменные argc (количество аргументов при запуске приложения) и argv (массив текущих аргументов) всегда доступны в CLI SAPI. При использовании 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 при запуске из командной строки.