PHP CLI框架:创建强大的控制台应用程序
现代PHP开发不仅限于Web应用程序。开发人员越来越需要创建控制台(CLI)工具:队列处理器、迁移、报告生成器、数据解析器。针对这些任务,存在专门的框架,它们简化了控制台命令的创建、参数处理、输出格式化和依赖管理。
主要的PHP CLI框架
- Symfony Console — 来自Symfony的最流行组件,用于Laravel、Drupal、Composer以及数百个其他项目。
- Laravel Zero — 基于Laravel的微框架,针对CLI应用程序进行了优化。
- CLIFramework — 轻量级框架,支持Zsh/Bash自动补全。
- PHP CLI Tools — 用于简单脚本的极简库。
Symfony Console:通用标准
symfony/console组件是PHP CLI应用程序的事实标准。它提供了一整套用于创建命令的工具,包括:
- 命令行参数和选项的自动解析。
- 支持颜色、表格和进度条的格式化输出。
- 交互式问题和自动补全。
- 灵活的事件系统和命令生命周期。
// Symfony Console简单命令示例<?php// 文件: src/Command/GreetCommand.phpnamespace App\\Command;
use Symfony\\Component\\Console\\Command\\Command;use Symfony\\Component\\Console\\Input\\InputArgument;use Symfony\\Component\\Console\\Input\\InputInterface;use Symfony\\Component\\Console\\Output\\OutputInterface;
class GreetCommand extends Command{ protected static $defaultName = 'app:greet';
protected function configure(): void { $this ->setDescription('向用户问好') ->addArgument('name', InputArgument::REQUIRED, '用户名') ->addOption('yell', null, null, '以大写字母输出'); }
protected function execute(InputInterface $input, OutputInterface $output): int { $name = $input->getArgument('name'); $message = "你好, $name!";
if ($input->getOption('yell')) { $message = strtoupper($message); }
$output->writeln($message); return Command::SUCCESS; }}
// 运行: php bin/console app:greet 伊万 --yellLaravel Zero:面向命令行的Laravel
Laravel Zero是一个微框架,它将Laravel的便利性(Eloquent ORM、Artisan、Blade、计划任务)带入了CLI世界。它非常适合创建不需要Web界面的独立控制台实用程序。
Laravel Zero的关键功能:
- 熟悉的Artisan命令语法。
- 内置数据库支持(SQLite、MySQL)。
- 任务调度器(类似Cron的功能)。
- 使用表格和进度条进行输出格式化。
- 能够编译成单个PHAR文件。
// Laravel Zero中的命令示例<?php// 文件: app/Commands/ExportUsers.phpnamespace App\\Commands;
use Illuminate\\Console\\Command;use App\\Models\\User;
class ExportUsers extends Command{ protected $signature = 'export:users {--format=csv : 输出格式 (csv/json)}'; protected $description = '导出用户列表';
public function handle(): int { $users = User::all(['id', 'name', 'email']); $format = $this->option('format');
if ($format === 'json') { $this->line($users->toJson(JSON_PRETTY_PRINT)); } else { $headers = ['