PHP 入门教程
PHP 命令行脚本
本教程共 65 篇 · 第 62 篇 · 更新于 2026-07-24 · 约 9 分钟阅读
PHPPHP8CLI命令行CronSymfony Console脚本
62. PHP 命令行脚本
本节目标:掌握 PHP CLI 模式的使用,能够编写命令行脚本,了解定时任务和 Symfony Console 组件。
PHP 不仅能写网页,也能写命令行程序。定时备份、数据导入、批量处理等场景,用 CLI 脚本比网页更合适。
1. CLI 与 Web 模式的区别
| 特性 | Web 模式 | CLI 模式 |
|---|---|---|
| 运行方式 | 通过浏览器/HTTP 请求 | 命令行直接执行 |
| 输出目标 | 浏览器 | 终端 |
| 超时限制 | 受 max_execution_time 限制 | 默认无限制 |
| 内存限制 | 受 memory_limit 限制 | 可单独配置 |
| 全局变量 | $_GET、$_POST 等 | $argv、$argc |
2. 运行 PHP 脚本
创建文件 hello.php:
<?php
echo 'Hello, CLI!' . PHP_EOL;
执行:
php hello.php
常用 CLI 参数:
php -i # 显示 PHP 配置信息
php -v # 查看 PHP 版本
php -a # 进入交互式 shell
php -r "echo 1+1;" # 直接执行代码
php -S localhost:8000 # 启动内置服务器
3. 接收命令行参数
PHP CLI 自动提供两个预定义变量:
$argc:参数个数(Argument Count)$argv:参数数组(Argument Vector),第一个元素是脚本名
<?php
// greet.php
if ($argc < 2) {
echo "用法:php greet.php <名字>\n";
exit(1);
}
$name = $argv[1];
echo "你好,{$name}!\n";
执行:
php greet.php 张三
# 输出:你好,张三!
多个参数:
<?php
// 参数:php script.php arg1 arg2 arg3
print_r($argv);
// [0] => script.php
// [1] => arg1
// [2] => arg2
// [3] => arg3
Tip退出状态码
0表示成功,非零表示错误。Shell 脚本可通过$?获取上一个命令的退出码。
4. 读取用户输入
<?php
echo '请输入你的名字:';
$name = trim(fgets(STDIN));
echo "你好,{$name}\n";
5. 定时任务(Cron)
Linux 系统可用 crontab 定时执行 PHP 脚本。
# 编辑定时任务
crontab -e
添加任务(每天凌晨 2 点执行备份):
0 2 * * * /usr/bin/php /var/www/backup.php >> /var/log/backup.log 2>&1
cron 时间格式:
分 时 日 月 星期 命令
| 示例 | 含义 |
|---|---|
*/5 * * * * | 每 5 分钟 |
0 * * * * | 每小时 |
0 0 * * * | 每天零点 |
0 9 * * 1 | 每周一上午 9 点 |
Windows 系统可使用”任务计划程序”实现类似功能。
6. Symfony Console 组件
对于复杂的命令行应用,推荐使用 Symfony Console 组件。它提供参数解析、命令分组、进度条等功能。
安装:
composer require symfony/console
简单示例:
<?php
require 'vendor/autoload.php';
use Symfony\Component\Console\Application;
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, '对方名字');
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$name = $input->getArgument('name');
$output->writeln("<info>你好,{$name}!</info>");
return Command::SUCCESS;
}
}
$app = new Application();
$app->add(new GreetCommand());
$app->run();
执行:
php console.php app:greet 张三
NoteLaravel、Symfony 等框架的命令行工具(
artisan、console)都基于 Symfony Console 组件。
小结
PHP CLI 让 PHP 的应用场景从网页延伸到服务端脚本。简单的任务用原生 $argv 即可,复杂应用推荐 Symfony Console 组件。
来源:参考了 php-the-right-way「Command Line Interface」、Symfony 官方文档,改写后所得。