Основные отличия от остальных реализаций 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 при запуске из командной строки.