我使用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接收。有任何想法嗎?
我使用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