编写PHP脚本交互命令
例如:
Laravel安装命令
composer global require "laravel/installer"
laravel new blog
控制台
php artisan serve
以下概括基于Laravel框架,其同时支持win和类Unix系统
win环境下
laravel命令调用的是 laravel.bat批处理文件
且 laravel.bat 所在的目录必须添加到 $PATH 环境变量
laravel.bat 文件内容:
@ECHO OFF
setlocal DISABLEDELAYEDEXPANSION
SET BIN_TARGET=%~dp0/../laravel/installer/laravel
php "%BIN_TARGET%" %*
注释:
dp0 可以理解为 laravel.bat 所在的当前目录
最终是 php 去执行一个文件,显然该文件是php格式的,没有后缀
Linux系统下
laravel命令调用的是 laravel文件,无后缀名,其实是shell脚本文件
laravel 文件内容:
#!/usr/bin/env sh
dir=$(d=${0%[/\\]*}; cd "$d" > /dev/null; cd "../laravel/installer" && pwd)
# See if we are running in Cygwin by checking for cygpath program
if command -v 'cygpath' >/dev/null 2>&1; then
# Cygwin paths start with /cygdrive/ which will break windows PHP,
# so we need to translate the dir path to windows format. However
# we could be using cygwin PHP which does not require this, so we
# test if the path to PHP starts with /cygdrive/ rather than /usr/bin
if [[ $(which php) == /cygdrive/* ]]; then
dir=$(cygpath -m "$dir");
fi
fi
dir=$(echo $dir | sed 's/ /\ /g')
"${dir}/laravel" "$@"
注释:
laravel 文件必须有可执行权限
laravel 所在的目录必须添加到 $PATH 环境变量,这样才可以全局使用,否则只能进入该目录然后
执行脚本 ./laravel
或者,将 laravel 文件移动到/usr/bin目录下,这样同样可以通过输入 laravel 命令来执行laravel文件
脚本文件有无后缀名并不重要,只需要文件内容可以被脚本解释器解释就行,比如,两个内容相同的
脚本文件被执行 php test 和 php test.php 结果一样。
可以通过 which php 来找到php解释器的路径
实际执行的 laravel 文件内容:
#!/usr/bin/env php
<?php
if (file_exists(__DIR__.'/../../autoload.php')) {
require __DIR__.'/../../autoload.php';
} else {
require __DIR__.'/vendor/autoload.php';
}
$app = new Symfony\Component\Console\Application('Laravel Installer', '2.0.1');
$app->add(new Laravel\Installer\Console\NewCommand);
$app->run();
?>
在php中
$_SERVER['argv'] 交互时传入的参数数组,参数是由空格隔开的。
$_SERVER['argc'] 交互时传入的参数的个数。
关于 #!/usr/bin/env php
在脚本文件头部加入 #!/usr/bin/env php 表示使用的环境变量设定的解释器来执行该脚本。
使用 php test.php 或者 /usr/local/php test.php 这种方式来运行的话头部是否有定义毫
无影响,因为我就是要PATH环境变量或者/usr/local/php来运行。
但是如果使用 ./test.php 方式来运行的话,头部必须定义一个解释器,否则无法被解释执行。
同时不同的写法使用的解释器也不一样,如下
#!/usr/bin/php
#!/usr/bin/env php
#!/usr/bin/env -S -P/usr/local/bin:/usr/bin php
#!/usr/bin/env -S-P/usr/local/bin:/usr/bin:${PATH} php
制作一个php脚本命令
vi test_php
输入内容:
#!/usr/bin/env php
<?php
var_dump($_SERVER['argv']);
echo PHP_EOL;
?>
chmod 777 test_php
试运行:
./test_php asd 123
没问题的话移到系统环境目录
mv test_php /usr/bin/test_php
运行:
test_php asd 123
打印:
array(3) {
[0]=>
string(17) "/usr/bin/test_php"
[1]=>
string(3) "asd"
[2]=>
string(3) "123"
}
更详细交互实现可参考Laravel的实现过程
因篇幅问题不能全部显示,请点此查看更多更全内容