从BASH传递一个变量到PHP
我使用bash脚本火PHP脚本,但我似乎无法得到所需的变量PHP ...从BASH传递一个变量到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");
的$argv[1]
变量只是不被PHP接收。有任何想法吗?
您在comment说,你正在使用php5-cgi
运行脚本。
php5-cgi
是解释者的CGI version;其目的是由Web服务器使用。
如果要在命令行上运行脚本,则必须使用CLI版本的解释器。它的名字是php
(或者,可能是你的系统上的php5
)。
解释器的CLI和CGI版本handle some things differently。变量$argc
和$argv
的内容是这些差异之一。
的CGI版本填充他们只有在register_argc_argv
选项在php.ini
设置为On
(或1
)。出于性能原因,这个选项通常是CGI的Off
。
另一方面,无论register_argc_argv
选项的值如何,CLI版本都会使用命令行中收到的参数填充$argc
和变量。
由于@andlrc也their answer指出,应该用双引号括$1
当你构建的shell脚本的命令行,以防止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");
也许它不工作,因为我使用PHP而不是php5?只是为了澄清,如果它没有错误,我现在正在做的方式有什么问题吗?是否存在安全问题? – Grant
是缺少的大括号只是这里的一个错字,而不是实际的脚本;) – Grant
CGI和CLI版本之间存在差异。例如,'$ argc'和'$ argv'通常不由CGI设置。此外,它对脚本的运行时间施加了限制(默认值:30秒) CLI版本没有时间限制。 CGI还生成使用命令行运行脚本时不需要的HTTP标头。 CLI版本不生成头文件(既不隐式也不调用函数header())。对于所有的差异,请阅读文档:http://php.net/manual/en/features.commandline.differences.php – axiac
我不能得到这个工作什么办法,我试了一下所以最后我刚安装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");
第一次工作完美。
希望它可以帮助别人,因为我浪费了好几个小时试图让它以各种其他方式工作而没有成功。
请注意[CGI和CLI二进制文件不等价](http://php.net/manual/en/features.commandline.differences.php)。 .. –
$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"
你是如何运行bash脚本的?你可以共享整个bash脚本吗? – Evert
没关系,我安装了php5-cgi,相应地改了它,它现在工作正常,只是无法得到它以这种方式工作 – Grant
您必须在php中启用[register-argc-argv](http://php.net/manual/en/ini.core.php#ini.register-argc-argv)指令.ini'。 – baf