【问题标题】:Passing a variable from BASH to PHP将变量从 BASH 传递到 PHP
【发布时间】:2016-06-08 00:39:47
【问题描述】:

我正在使用 bash 脚本来触发 PHP 脚本,但我似乎无法将变量导入 PHP...

$1=mymusic.mp3 的 Bash 脚本

php /var/www/html/wave/waveform.php $1;

PHP

$mp3 = '/var/www/html/processed/' . $argv[1];
copy($mp3, "$tmpname}_0.mp3");

$argv[1] 变量只是没有被 PHP 接收。有什么想法吗?

【问题讨论】:

  • 你是如何运行 bash 脚本的?你能分享整个 bash 脚本吗?
  • 没关系,我安装了php5-cgi,做了相应的修改,现在可以正常工作了,就是不能这样工作。
  • 您必须在php.ini 中启用register-argc-argv 指令。
  • @baf 这是问题所在,谢谢;)

标签: php bash variables


【解决方案1】:

您在comment 中说您正在使用php5-cgi 运行脚本。

php5-cgi 是解释器的CGI version;它的目的是供网络服务器使用。

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

解释器 handle some things differently 的 CLI 和 CGI​​ 版本。变量$argc$argv 的内容就是这些差异之一。

仅当php.ini 中的register_argc_argv 选项设置为On(或1)时,CGI 版本才会填充它们。出于性能原因,对于 CGI,此选项通常为 Off

另一方面,无论register_argc_argv 选项的值如何,CLI 版本都会使用命令行中收到的参数填充$argc$argv 变量。

正如@andlrc 在their answer 中也指出的那样,当您在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,所以它不起作用?只是为了澄清一下,如果我现在这样做的方式没有错误,那么它到底有什么问题?是否存在安全问题?
  • 是的,缺少的大括号只是这里的一个错字,而不是实际的脚本;)
  • CGI 和 CLI 版本之间存在差异。例如,$argc$argv 通常不是由 CGI 设置的。此外,它对脚本的运行时间施加了限制(默认值:30 秒); CLI 版本没有时间限制。 CGI 还会生成使用命令行运行脚本时不需要的 HTTP 标头。 CLI 版本不生成标头(无论是隐含的,也不是在调用函数 header() 时)。对于所有差异,请阅读文档:php.net/manual/en/features.commandline.differences.php
【解决方案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"

【讨论】:

    【解决方案3】:

    我尝试过的任何方式都无法让它工作,所以最后我只安装了 php5-cgi,现在这样称呼它......

    重击

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

    第一次完美运行。

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

    【讨论】:

    猜你喜欢
    • 2018-10-22
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多