
7折
减价出售
¥799
PHP CLI(Command Line Interface)模式是PHP的一种特殊运行方式,与常见的Web服务器模式(如通过Apache或Nginx运行的PHP-FPM)有着本质区别。CLI模式将PHP转变为强大的脚本语言工具,可以直接在终端中执行PHP脚本,无需通过Web服务器。
特性 | CLI模式 | Web服务器模式 |
---|---|---|
执行方式 | 命令行直接调用 | HTTP请求触发 |
输入来源 | 命令行参数/标准输入 | GET/_POST等超全局变量 |
输出目标 | 标准输出 | HTTP响应体 |
超时设置 | 默认无限制 | 通常30秒超时 |
内存限制 | 可配置,默认较高 | 通常128M限制 |
会话处理 | 无自动会话管理 | 自动处理HTTP会话 |
# 执行PHP脚本
php script.php
# 直接执行代码片段
php -r "echo 'Hello CLI';"
# 带参数执行
php script.php arg1 arg2
// script.php
<?php
// 获取所有参数
$args = $_SERVER['argv'];
$script_name = array_shift($args); // 脚本名称
// 使用getopt解析复杂参数
$options = getopt("f:hv", ["file:", "help", "verbose"]);
if (isset($options['h']) || isset($options['help'])) {
echo "Usage: php script.php -f <file> [--verbose]\n";
exit(0);
}
if (isset($options['f'])) {
$file = $options['f'];
echo "Processing file: $file\n";
}
2. 交互式输入输出
// 读取用户输入
function prompt($message) {
echo $message;
return trim(fgets(STDIN));
}
$name = prompt("Enter your name: ");
echo "Hello, $name!\n";
// 进度条显示
function show_progress($done, $total) {
$perc = floor(($done / $total) * 100);
$bar = str_repeat("=", $perc/2) . ">";
printf("\r[%-50s] %d%%", $bar, $perc);
}
for ($i=1; $i<=100; $i++) {
show_progress($i, 100);
usleep(100000);
}
<?php
// 成为守护进程
function daemonize() {
$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork");
} elseif ($pid) {
exit(); // 父进程退出
}
// 成为会话组长
if (posix_setsid() == -1) {
die("Could not become session leader");
}
// 再次fork确保不是终端控制进程
$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork");
} elseif ($pid) {
exit(); // 父进程退出
}
// 关闭标准流
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
}
daemonize();
// 守护进程主逻辑
while (true) {
// 执行任务...
sleep(1);
}
2. 并行处理任务
<?php
// 使用pcntl扩展实现多进程
$workers = 4;
$pids = [];
for ($i = 0; $i < $workers; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork");
} elseif ($pid) {
// 父进程记录子进程ID
$pids[] = $pid;
} else {
// 子进程执行任务
$worker_id = $i;
echo "Worker $worker_id started\n";
// 模拟工作
sleep(rand(1, 3));
echo "Worker $worker_id finished\n";
exit($worker_id); // 子进程退出
}
}
// 父进程等待所有子进程完成
foreach ($pids as $pid) {
pcntl_waitpid($pid, $status);
$worker_exit_code = pcntl_wexitstatus($status);
echo "Worker $worker_exit_code exited with status $status\n";
}
WordPress官方命令行工具示例:
# 安装插件
wp plugin install woocommerce --activate
# 批量更新文章
wp post update $(wp post list --post_type=post --format=ids) --post_status=publish
# 执行自定义命令
wp my-command do-something --param=value
2. 自定义WordPress CLI命令
// 在插件中注册CLI命令
if (defined('WP_CLI') && WP_CLI) {
WP_CLI::add_command('my-plugin', 'My_Plugin_CLI');
}
class My_Plugin_CLI {
/**
* 批量处理数据
*
* ## OPTIONS
*
* [--dry-run]
* : 试运行不实际修改数据
*
* @param array $args
* @param array $assoc_args
*/
public function process_data($args, $assoc_args) {
$dry_run = isset($assoc_args['dry-run']);
WP_CLI::line("Starting data processing..." . ($dry_run ? " (dry run)" : ""));
$progress = \WP_CLI\Utils\make_progress_bar(
"Processing items",
$this->get_item_count()
);
foreach ($this->get_items() as $item) {
if (!$dry_run) {
$this->process_item($item);
}
$progress->tick();
}
$progress->finish();
WP_CLI::success("Processing completed!");
}
// 其他命令方法...
}
PHPUnit CLI配置示例:
# 运行测试
./vendor/bin/phpunit tests/
# 生成代码覆盖率报告
./vendor/bin/phpunit --coverage-html ./coverage tests/
2. 交互式调试
# 使用PsySH进行交互调试
./vendor/bin/psysh
# 在代码中设置断点
if (function_exists('psy_debug')) {
psy_debug(get_defined_vars());
}
PHP CLI模式在现代化开发中扮演着重要角色,以下是关键实践建议:
典型应用场景包括:
随着PHP 8.x的发布,CLI模式获得了更多强大特性,如JIT编译带来的性能提升,使得PHP在命令行工具领域更具竞争力。掌握CLI开发技巧,将使开发者能够构建更强大、更高效的PHP应用生态系统。
减价出售
减价出售
减价出售
减价出售
电话咨询
1855-626-3292
微信咨询