一、为什么需要PHP命令行工具

你可能觉得PHP就是个做网站的脚本语言,但其实它完全可以在命令行里大显身手。想象一下,你需要批量处理数据、定时跑个脚本,或者搞个自动化部署工具,这时候PHP命令行工具就能派上用场了。

比如,你有个需求:每天凌晨3点从数据库拉取数据,处理后生成报表。用浏览器访问网页触发?太不靠谱了。这时候写个PHP命令行脚本,配合crontab定时任务,完美解决。

二、搭建基础CLI应用骨架

先来个最简单的PHP命令行脚本:

#!/usr/bin/env php
<?php
// cli-demo.php
if (php_sapi_name() !== 'cli') {
    die('请通过命令行运行此脚本');
}

echo "你好,这是你的第一个PHP命令行程序!\n";

保存后,给执行权限:

chmod +x cli-demo.php
./cli-demo.php

看到输出没?这就成了!但光这样太简陋,我们需要更专业的处理方式。

三、使用Symfony Console组件

专业选手都用现成的轮子,Symfony Console组件就是PHP CLI开发的瑞士军刀。先用Composer安装:

composer require symfony/console

来个完整示例:

<?php
// app.php
require __DIR__.'/vendor/autoload.php';

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class GreetCommand extends Command
{
    protected static $defaultName = 'app:greet';
    
    protected function configure()
    {
        $this->setDescription('打招呼命令')
             ->addArgument('name', InputArgument::OPTIONAL, '你的名字', '陌生人');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $name = $input->getArgument('name');
        $output->writeln("你好, $name!");
        return Command::SUCCESS;
    }
}

$app = new Application('我的CLI工具', '1.0.0');
$app->add(new GreetCommand());
$app->run();

运行试试:

php app.php app:greet
php app.php app:greet 老王

四、高级功能实战

4.1 带选项的命令

修改上面的GreetCommand:

protected function configure()
{
    $this->addOption(
        'yell',
        null,
        InputOption::VALUE_NONE,
        '是否要大写输出'
    );
}

protected function execute(InputInterface $input, OutputInterface $output)
{
    $text = sprintf('你好, %s!', $input->getArgument('name'));
    
    if ($input->getOption('yell')) {
        $text = strtoupper($text);
    }
    
    $output->writeln($text);
    return Command::SUCCESS;
}

试试看:

php app.php app:greet --yell 老王

4.2 进度条显示

处理大量数据时,进度条很实用:

// 在execute方法中添加
$items = range(1, 100);
$progressBar = new ProgressBar($output, count($items));

foreach ($items as $item) {
    usleep(10000); // 模拟耗时操作
    $progressBar->advance();
}

$progressBar->finish();
$output->writeln(''); // 换行

五、实际应用场景

  1. 数据批处理:比如定期清理数据库垃圾数据
  2. 定时任务:生成日报、周报等
  3. 部署脚本:自动化执行git pull、composer install等
  4. 系统监控:检查服务器状态并报警

六、技术优缺点分析

优点

  • PHP开发者上手快
  • 丰富的生态系统(Symfony Console等)
  • 跨平台运行

缺点

  • 性能不如Golang等编译型语言
  • 内存管理需要特别注意

七、注意事项

  1. 错误处理要完善,特别是长时间运行的任务
  2. 注意内存泄漏问题,长时间运行脚本建议定期unset变量
  3. 日志记录很重要,建议使用Monolog等日志库
  4. 考虑添加--help等帮助信息

八、总结

PHP命令行工具开发其实很简单,借助Symfony Console这样的组件,可以快速构建功能强大的CLI应用。无论是简单的脚本还是复杂的命令行工具,PHP都能胜任。下次遇到需要自动化处理的任务时,不妨试试用PHP来实现吧!