从BASH传递变量到PHP

3

我正在使用一个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>

你是如何运行Bash脚本的?你能分享整个Bash脚本吗? - Evert
没问题,我安装了php5-cgi,并进行了相应的更改,现在它运行得很好,之前就是无论如何都无法让它工作。 - Grant
2
您必须在 php.ini 中启用 register-argc-argv 指令。 - baf
@baf 这就是问题所在,谢谢 ;) - Grant
3个回答

5

您在评论中提到您正在使用php5-cgi来运行脚本。

php5-cgi是解释器的CGI版本;它的目的是供Web服务器使用。

如果您想在命令行上运行脚本,则必须使用解释器的CLI版本。它的名称是php(或可能是您系统上的php5)。

解释器的CLI和CGI版本处理某些事情有所不同。变量$argc$argv的内容就是其中之一的区别

CGI版本只有在php.ini中的register_argc_argv选项设置为On(或1)时才填充它们。出于性能原因,CGI通常将此选项设置为Off
另一方面,CLI版本无论register_argc_argv选项的值如何,都会用命令行接收到的参数填充$argc$argv变量。
正如@andlrc在他们的回答中指出的那样,当你在shell脚本中构造命令行时,应该用双引号括起来$1,以防止shell将其分成单词。
php /var/www/html/wave/waveform.php "$1"

如果,例如,$1的值是foo bar(两个单词),则您原来的使用方法呈现为php waveform.php foo barprint_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");"。

也许是因为我使用的是php而不是php5,所以它才不能正常工作?只是想澄清一下,如果现在这种方式可以无故障地工作,那么到底哪里出了问题?是否存在安全问题? - Grant
是的,这个缺失的花括号只是在这里打字时出现了错误,而不是在实际脚本中出现了错误 ;) - Grant
1
CGI和CLI版本之间存在差异。例如,$argc$argv通常不会由CGI设置。此外,它对脚本的运行时间施加了限制(默认为30秒);CLI版本没有时间限制。CGI还会生成在使用命令行运行脚本时不需要的HTTP头。CLI版本不会生成头文件(无论是隐式的还是在调用函数header()时)。有关所有差异,请阅读文档:http://php.net/manual/en/features.commandline.differences.php - axiac

2

$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"

-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");

第一次就完美运行。

希望它能帮助其他人,因为我曾经浪费了几个小时尝试以其他各种方式让它工作,但没有成功。


1
请注意,CGI和CLI二进制文件不相等...(参见http://php.net/manual/en/features.commandline.differences.php) - Álvaro González

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接