我正在使用一个Bash脚本来执行PHP脚本,但似乎无法将变量传递到PHP中...
Bash脚本,其中$1=mymusic.mp3
php /var/www/html/wave/waveform.php $1;
PHP
$mp3 = '/var/www/html/processed/' . $argv[1];
copy($mp3, "$tmpname}_0.mp3");
< p> $ argv [1]
变量没有被 PHP 接收到。有什么建议吗?< /p>
您在评论中提到您正在使用php5-cgi
来运行脚本。
php5-cgi
是解释器的CGI版本;它的目的是供Web服务器使用。
如果您想在命令行上运行脚本,则必须使用解释器的CLI版本。它的名称是php
(或可能是您系统上的php5
)。
解释器的CLI和CGI版本处理某些事情有所不同。变量$argc
和$argv
的内容就是其中之一的区别 。
register_argc_argv
选项设置为On
(或1
)时才填充它们。出于性能原因,CGI通常将此选项设置为Off
。register_argc_argv
选项的值如何,都会用命令行接收到的参数填充$argc
和$argv
变量。$1
,以防止shell将其分成单词。php /var/www/html/wave/waveform.php "$1"
$1
的值是foo bar
(两个单词),则您原来的使用方法呈现为php waveform.php foo bar
,print_r($argv)
显示:Array
(
[0] => waveform.php
[1] => foo
[2] => bar
)
$1
用引号括起来,命令行变成php waveform.php "foo bar"
,shell将foo bar
作为单个参数传递给PHP脚本。 print_r($argv)
输出:Array
(
[0] => waveform.php
[1] => foo bar
)
copy($mp3, "$tmpname}_0.mp3");
中缺少一个{
。正确的写法应该是"copy($mp3, "${tmpname}_0.mp3");
"。$argc
和$argv
通常不会由CGI设置。此外,它对脚本的运行时间施加了限制(默认为30秒);CLI版本没有时间限制。CGI还会生成在使用命令行运行脚本时不需要的HTTP头。CLI版本不会生成头文件(无论是隐式的还是在调用函数header()
时)。有关所有差异,请阅读文档:http://php.net/manual/en/features.commandline.differences.php - axiac$argv[1]
应该可行,考虑以下示例:
% php -r 'var_dump($argv);' hello
array(2) {
[0]=>
string(1) "-"
[1]=>
string(5) "hello"
}
但是您应该引用$1
,否则它将经历单词拆分和通配符扩展:
php /var/www/html/wave/waveform.php "$1"
我无论如何都无法让它工作,最终我只安装了php5-cgi,现在像这样调用它...
BASH
php-cgi -f /var/www/html/wave/waveform.php var=$1;
PHP
$filename = $_GET["var"];
$mp3 = '/var/www/html/processed/' . $filename;
copy($mp3, "$tmpname}_0.mp3");
第一次就完美运行。
希望它能帮助其他人,因为我曾经浪费了几个小时尝试以其他各种方式让它工作,但没有成功。
php.ini
中启用 register-argc-argv 指令。 - baf