PHP CLI как использовать для запуска скриптов

Что такое php cli

Что такое php cli

Запуск скрипта через CLI осуществляется командой php путь_к_файлу.php. В скрипте рекомендуется использовать глобальный массив $argv для передачи аргументов и $argc для проверки их количества. Это позволяет создавать универсальные скрипты, которые реагируют на параметры командной строки без необходимости изменения кода.

Для задач автоматизации удобно комбинировать PHP CLI с планировщиком задач, например cron на Linux или Task Scheduler на Windows. При этом важно указывать абсолютные пути к файлам и интерпретатору PHP, а также проверять права доступа к скриптам, чтобы избежать ошибок выполнения.

CLI также предоставляет доступ к расширениям, которые могут быть недоступны в веб-среде, включая работу с потоками, базами данных или файловой системой на уровне ОС. Использование ini_set и php_ini_loaded_file() позволяет управлять настройками PHP во время запуска, обеспечивая гибкость конфигурации под конкретные задачи.

Установка и проверка PHP CLI на сервере

Установка и проверка PHP CLI на сервере

Для использования PHP через командную строку необходимо убедиться, что установлен пакет PHP CLI. На большинстве Linux-серверов он поставляется отдельно от веб-сервера.

Проверка наличия PHP CLI выполняется командой:

php -v

Если CLI установлен, вы увидите версию PHP и информацию о сборке.

Установка на популярных системах:

  • Debian/Ubuntu: sudo apt update && sudo apt install php-cli
  • CentOS/RHEL: sudo yum install php-cli или sudo dnf install php-cli для более новых версий
  • Fedora: sudo dnf install php-cli

После установки повторно выполните php -v для проверки корректной работы. Важно убедиться, что версия CLI совпадает с версией, используемой для веб-приложений, чтобы избежать несовместимости скриптов.

Для проверки пути к исполняемому файлу используйте:

which php

Для теста работы CLI можно создать простой скрипт test.php с содержимым:

<?php
echo "PHP CLI работает\n";
?>

Запуск:

php test.php

Запуск скрипта через командную строку Windows и Linux

В Windows откройте командную строку и перейдите в папку со скриптом с помощью cd C:\путь\к\папке. Запуск осуществляется командой:

php имя_скрипта.php

Если PHP не добавлен в переменную PATH, используйте полный путь к исполняемому файлу, например:

C:\php\php.exe имя_скрипта.php

В Linux терминал открывается в любой директории. Перейдите к скрипту командой cd /путь/к/скрипту и выполните:

php имя_скрипта.php

Для запуска с правами на выполнение добавьте шебанг #!/usr/bin/php в начало файла, установите права chmod +x имя_скрипта.php и запускайте как ./имя_скрипта.php.

Передача аргументов выполняется так:

php имя_скрипта.php аргумент1 аргумент2

Аргументы доступны внутри скрипта через массив $argv: $argv[0] – имя скрипта, $argv[1] и далее – значения аргументов.

Для фонового выполнения в Windows используйте start /B php имя_скрипта.php, в Linux – nohup php имя_скрипта.php &. Это позволяет завершить сессию терминала без остановки скрипта.

Передача аргументов скрипту через CLI

Передача аргументов скрипту через CLI

PHP CLI позволяет передавать параметры скрипту через массив $argv. Первый элемент $argv[0] содержит имя скрипта, последующие – переданные аргументы. Например, при запуске php script.php user 25 $argv[1] будет user, а $argv[2]25.

Для обработки опций удобно использовать функцию getopt(). Она позволяет задавать короткие и длинные ключи: php script.php -u admin --age=25. В скрипте это можно обработать так: $options = getopt("u:", ["age:"]);, где $options['u'] будет admin, а $options['age']25.

При работе с числовыми и строковыми параметрами рекомендуется проверять тип и наличие значения через isset() и is_numeric(), чтобы избежать ошибок выполнения. Например, if(isset($argv[2]) && is_numeric($argv[2])) { $age = (int)$argv[2]; }.

Если скрипт предполагает динамическое количество аргументов, удобно использовать цикл for или foreach по $argv, начиная с $argv[1]. Для сложных сценариев с множеством флагов лучше объединять $argv с getopt() для гибкого парсинга и валидации параметров.

Аргументы CLI можно комбинировать с переменными окружения через $_ENV или getenv(), чтобы передавать секретные ключи и настройки без отображения их в командной строке.

Использование переменных окружения в PHP CLI

В PHP CLI переменные окружения позволяют конфигурировать поведение скриптов без изменения кода. Их можно задать перед запуском скрипта через командную строку: ENV_VAR=value php script.php. Внутри скрипта переменные доступны через глобальный массив $_ENV или функцию getenv('ENV_VAR').

Для постоянного использования переменных можно определить их в файле .env и подключить через библиотеку vlucas/phpdotenv. Пример загрузки: (new Dotenv\Dotenv(__DIR__))->load();, после чего все переменные будут доступны через getenv() и $_ENV.

В CLI также можно управлять переменными через команду putenv('KEY=value'), которая изменяет окружение текущего процесса. Эти значения доступны только внутри текущего скрипта и дочерних процессов.

Для передачи конфиденциальных данных, например токенов API, рекомендуется использовать переменные окружения вместо жесткого кодирования в скриптах. В Linux их удобно хранить в /etc/profile.d/ или в ~/.bashrc, в Windows – через системные настройки «Переменные среды».

При запуске нескольких скриптов с разными настройками полезно использовать отдельные файлы конфигурации и динамически загружать нужные переменные окружения через CLI, чтобы избежать конфликтов и утечек данных.

Отладка скриптов в командной строке

Отладка скриптов в командной строке

Команда php -a активирует интерактивный режим PHP, позволяющий тестировать отдельные участки кода, проверять выражения и мгновенно видеть результат без перезапуска всего скрипта.

Для сложных проектов целесообразно использовать логирование через стандартное расширение Monolog или встроенные функции error_log(). Логирование ошибок в файл с указанием временной метки облегчает анализ последовательности событий и поиск причин сбоев.

Дополнительно, проверка синтаксиса производится командой php -l script.php, что позволяет выявлять ошибки до выполнения скрипта. Совмещение всех этих подходов – включение отображения ошибок, интерактивный режим, логирование и Xdebug – обеспечивает полное покрытие для отладки CLI-скриптов.

Автоматизация запуска через cron и планировщик задач

Для регулярного выполнения PHP CLI скриптов на Linux используется cron. Создайте задачу через команду crontab -e и укажите временной интервал и команду запуска. Например, для выполнения скрипта каждые 30 минут используйте: */30 * * * * /usr/bin/php /путь/к/скрипту.php. Указывайте полный путь к PHP и к скрипту для предотвращения ошибок среды.

Для записи логов используйте перенаправление: /usr/bin/php /путь/к/скрипту.php >> /var/log/script.log 2>&1. Это позволит фиксировать ошибки и результаты выполнения.

На Windows автоматизация выполняется через Планировщик задач. Создайте новую задачу, укажите триггер по расписанию и в поле «Программа или сценарий» укажите путь к php.exe. В аргументы добавьте полный путь к скрипту, например: C:\scripts\script.php. Установите рабочую директорию, чтобы скрипт корректно обрабатывал относительные пути.

Для проверки корректности настроек используйте ручной запуск из CLI: php /путь/к/скрипту.php. Также полезно настроить уведомления при ошибках через электронную почту или системные сообщения.

Если скрипт зависит от переменных окружения, убедитесь, что они заданы внутри cron или Планировщика задач, так как контекст выполнения отличается от интерактивной сессии.

Регулярно анализируйте логи и планировщик задач для предотвращения накопления ошибок и сбоев в автоматическом запуске.

$input = fgets(STDIN);
fwrite(STDOUT, "Вы ввели: $input");

Для одновременного чтения нескольких потоков можно применять stream_select(). Она проверяет доступность данных для чтения и записи без блокировки выполнения скрипта:

$read = [STDIN];
$write = null;
$except = null;
if (stream_select($read, $write, $except, 0, 200000)) {
  $line = fgets(STDIN);
  fwrite(STDOUT, "Прочитано: $line");
}

Для работы с файловыми потоками используют fopen(), fread(), fwrite() и fclose(). Потоки можно комбинировать с STDOUT для логирования процесса выполнения скрипта.

Функция Назначение Пример использования
fgets() Чтение строки из потока $line = fgets(STDIN);
fwrite() Запись данных в поток fwrite(STDOUT, «Сообщение»);
fflush() Принудительная запись буферизованных данных fflush(STDOUT);
stream_select() Проверка доступности потоков для чтения/записи stream_select($read, $write, $except, 0, 200000);
fopen()/fread()/fclose() Работа с файловыми потоками $file = fopen(‘log.txt’,’r’);

Обработка ошибок и логирование в CLI-скриптах

В CLI-скриптах PHP критично контролировать ошибки и фиксировать события, чтобы исключить некорректное выполнение и облегчить диагностику. Стандартные подходы включают использование встроенных функций и расширений для логирования.

Для обработки ошибок применяются:

  • set_exception_handler() – обрабатывает необработанные исключения, предотвращая молчаливое завершение скрипта.
  • register_shutdown_function() – фиксирует критические ошибки, включая фатальные, с возможностью логирования перед завершением.

Рекомендации по логированию:

  1. Использовать error_log() с указанием файла для логирования, например: error_log($message, 3, '/var/log/cli_script.log');
  2. Добавлять временные метки и уровень ошибки в лог-сообщения для быстрого анализа: [$level] [Y-m-d H:i:s] Сообщение.
  3. Разделять логи на категории: информационные события, предупреждения и критические ошибки, чтобы быстро фильтровать данные.
  4. Использовать стандартные библиотеки вроде Monolog для централизованного логирования, поддерживающие ротацию файлов и отправку логов на удаленные сервисы.

Пример обработки ошибок и логирования в CLI:

<?php
set_error_handler(function($errno, $errstr, $errfile, $errline) {
error_log("[ERROR] [$errno] $errstr in $errfile:$errline\n", 3, '/var/log/cli_script.log');
fwrite(STDERR, "Ошибка: $errstr\n");
});
set_exception_handler(function($e) {
error_log("[EXCEPTION] {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}\n", 3, '/var/log/cli_script.log');
fwrite(STDERR, "Исключение: {$e->getMessage()}\n");
});
register_shutdown_function(function() {
$error = error_get_last();
if ($error) {
error_log("[FATAL] {$error['message']} in {$error['file']}:{$error['line']}\n", 3, '/var/log/cli_script.log');
}
});
?>

Эта конфигурация позволяет ловить все ошибки и исключения, а также фиксировать фатальные сбои, обеспечивая полную прозрачность работы CLI-скрипта.

Вопрос-ответ:

Что такое PHP CLI и чем оно отличается от запуска скриптов через веб-сервер?

PHP CLI — это интерфейс командной строки для PHP, который позволяет выполнять скрипты напрямую из терминала без участия веб-сервера. В отличие от запуска через браузер, где PHP работает как модуль веб-сервера и обрабатывает HTTP-запросы, CLI не использует HTTP-протокол, что позволяет запускать длительные или системные скрипты, обрабатывать файлы и работать с базами данных в автономном режиме.

Как правильно запустить PHP скрипт через терминал?

Для запуска скрипта через PHP CLI нужно открыть терминал, перейти в папку с файлом и выполнить команду вида php имя_файла.php. Если PHP установлен и доступен в системной переменной PATH, скрипт выполнится, а результат будет выведен прямо в терминал. Также можно указать абсолютный путь к исполняемому файлу PHP, если системный путь не настроен.

Можно ли передавать параметры скрипту при запуске через CLI?

Да, скрипту можно передавать аргументы через командную строку. Например, команда php script.php arg1 arg2 передаст два параметра. Внутри скрипта их можно получить через массив $argv, где $argv[0] — это имя файла, а $argv[1], $argv[2] и так далее — переданные значения. Такой подход позволяет делать скрипты более универсальными и управляемыми без изменения кода.

Как настроить автоматический запуск PHP CLI скриптов на сервере?

На Linux и macOS для автоматизации можно использовать cron. Нужно создать задание в crontab с указанием команды php /путь/к/скрипту.php и интервала выполнения. На Windows используется Планировщик заданий, где указывается путь к PHP и скрипту. Этот способ полезен для регулярных задач, таких как обработка данных, резервное копирование или отправка уведомлений.

Можно ли запускать PHP CLI скрипты в фоне и получать вывод позже?

Да, в Linux можно использовать символ & для запуска процесса в фоне: php script.php &. Также можно перенаправлять вывод в файл с помощью php script.php > output.txt 2>&1 &. Это позволяет продолжать работу в терминале, а результаты скрипта просматривать позже, что удобно для долгих операций или анализа логов.

Ссылка на основную публикацию