如何在Phar打包的可执行文件中传递并获取命令行参数?
当然可行!Phar包完全支持命令行参数传递与访问
你说的php file.phar x y z这种用法完全没问题,处理方式和普通PHP脚本几乎一致,下面给你几个具体的解决方向:
直接用全局变量
$argv和$argc
这是最直接的方式,和普通PHP脚本一样,$argv是存储所有参数的数组(第一个元素是Phar包的文件名),$argc是参数的总个数。在你的Phar入口脚本里这么写就行:<?php // 你的Phar入口脚本(比如index.php) echo "参数总数:" . $argc . "\n"; echo "所有参数:\n"; foreach ($argv as $index => $param) { echo "参数{$index}:{$param}\n"; }执行
php file.phar x y z后,会输出:参数总数:4 所有参数: 参数0:file.phar 参数1:x 参数2:y 参数3:z用
getopt()处理带选项的参数
如果需要处理带选项的参数(比如php file.phar --name test -v),getopt()函数同样适用,它能帮你解析短选项(如-v)和长选项(如--name):<?php // 解析短选项v(无值)和长选项name(需要值) $options = getopt('v', ['name:']); var_dump($options); // 获取剩下的非选项参数 $nonOptionArgs = array_slice($argv, optind); var_dump($nonOptionArgs);执行
php file.phar --name Graham -v x y,会得到:array(2) { ["v"]=> bool(true) ["name"]=> string(6) "Graham" } array(2) { [0]=> string(1) "x" [1]=> string(1) "y" }确保Phar入口点正确设置
打包Phar时,一定要指定包含参数处理逻辑的文件作为入口点。比如用PHP代码打包:<?php $phar = new Phar('file.phar'); // 从src目录打包所有文件 $phar->buildFromDirectory(__DIR__ . '/src'); // 设置index.php为默认入口脚本 $phar->setDefaultStub('index.php');如果用
phar命令行工具打包,也可以通过--stub参数指定入口,或者默认会找目录里的index.php作为入口。
另外,如果你的Phar包设置了可执行权限和shebang(比如#!/usr/bin/env php),直接运行./file.phar x y z也是可以的,参数同样能被正确捕获。
内容的提问来源于stack exchange,提问作者GrahamL
相关产品推荐
相关产品推荐

