Скрипты для командной строки
PHP работает не только на сайте. Скрипт можно запустить из терминала: импортировать файл, разослать письма, очистить старые данные, пересчитать статистику. Такие скрипты не зависят от браузера и могут работать сколько угодно долго.
Примеры предназначены для терминала и здесь не запускаются — выполните их у себя.
Запуск
<?php
// hello.php
echo "Привет из терминала!\n";php hello.phpТега <html> и заголовков здесь нет: вывод попадает прямо в терминал. Перенос строки ставят сами — символом \n или константой PHP_EOL.
Аргументы
Всё, что написано после имени файла, попадает в массив $argv. Нулевой элемент — имя скрипта, $argc — число элементов:
<?php
// greet.php
if ($argc < 2) {
echo "Использование: php greet.php имя\n";
exit(1);
}
echo "Привет, {$argv[1]}!\n";php greet.php АннаЧтение ввода
Скрипт может задать вопрос и дождаться ответа. Ввод читают из потока STDIN:
<?php
// ask.php
echo 'Как вас зовут? ';
$name = trim(fgets(STDIN));
echo "Здравствуйте, $name!\n";fgets() возвращает строку вместе с переносом, поэтому её обрезают функцией trim().
Ошибки и код завершения
Сообщения об ошибках пишут в отдельный поток STDERR, а скрипт завершают кодом: 0 — успех, любое другое число — сбой:
<?php
// import.php
$file = $argv[1] ?? '';
if (!is_file($file)) {
fwrite(STDERR, "Файл не найден: $file\n");
exit(1);
}
echo 'Строк: ', count(file($file)), "\n";
exit(0);По коду завершения другие программы — планировщик, система размещения — понимают, удалась ли операция.
Именованные параметры
Функция getopt() разбирает параметры вида --limit=10:
<?php
// export.php
$options = getopt('', ['limit:', 'format::', 'verbose']);
$limit = (int) ($options['limit'] ?? 100);
$format = $options['format'] ?? 'csv';
$verbose = isset($options['verbose']);
echo "Формат: $format, записей: $limit\n";php export.php --limit=10 --format=json --verboseОдно двоеточие после имени — значение обязательно, два — необязательно, без двоеточий — параметр-флаг.
Полезные ключи PHP
| Команда | Что делает |
|---|---|
php -v | Показывает версию |
php -l file.php | Проверяет синтаксис, не запуская |
php -r 'echo 2 + 2;' | Выполняет код из строки |
php -a | Интерактивный режим |
php -S localhost:8000 | Запускает сервер для разработки |
php -m | Показывает подключённые расширения |
Запуск по расписанию
На сервере скрипты запускает планировщик cron. Строка в его таблице задаёт время и команду:
0 3 * * * php /var/www/shop/cleanup.phpЭтот скрипт выполняется каждый день в 3:00.
Частая ошибка
Относительные пути в скрипте отсчитываются не от файла, а от папки, из которой его запустили. file('data.csv') найдёт файл при запуске из папки проекта и не найдёт из cron. Стройте пути от константы __DIR__ — папки, где лежит сам скрипт:
<?php
// report.php
$rows = file(__DIR__ . '/data.csv');