Respostas:
Normalmente, para passar argumentos para um script de linha de comando, você usará argv
a variável global ou getopt :
// bash command:
// php -e myscript.php hello
echo $argv[1]; // prints hello
// bash command:
// php -e myscript.php -f=world
$opts = getopt('f:');
echo $opts['f']; // prints world
$ _GET refere-se aos parâmetros do método HTTP GET, que não estão disponíveis na linha de comando, pois requerem um servidor da Web para preencher.
Se você realmente deseja preencher $ _GET de qualquer maneira, pode fazer o seguinte:
// bash command:
// export QUERY_STRING="var=value&arg=value" ; php -e myscript.php
parse_str($_SERVER['QUERY_STRING'], $_GET);
print_r($_GET);
/* outputs:
Array(
[var] => value
[arg] => value
)
*/
Você também pode executar um determinado script, preencher a $_GET
partir da linha de comando, sem precisar modificar o referido script:
export QUERY_STRING="var=value&arg=value" ; \
php -e -r 'parse_str($_SERVER["QUERY_STRING"], $_GET); include "index.php";'
Observe que você pode fazer o mesmo com $_POST
e $_COOKIE
também.
getopt()
, isso aparentemente indica ao PHP que você deseja o argumento f
, não a opção f
(que seria especificada menos os dois pontos). Portanto, é apenas sintaxe.
Desta resposta no ServerFault :
Use o php-cgi
binário em vez de apenas php
e passe os argumentos na linha de comando, assim:
php-cgi -f index.php left=1058 right=1067 class=A language=English
O que coloca isso em $_GET
:
Array
(
[left] => 1058
[right] => 1067
[class] => A
[language] => English
)
Você também pode definir variáveis de ambiente que seriam definidas pelo servidor da web, assim:
REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething
funciona bem ..
Eu não tenho um binário php-cgi no Ubuntu, então fiz o seguinte:
% alias php-cgi = "php -r '"' parse_str (implode ("&", array_slice ($ argv, 2)), $ _GET); include ($ argv [1]); '"' -" % php-cgi test1.php foo = 123 <html> Você define foo para 123. </html> % cat test1.php <html> Você define foo para <? php print $ _GET ['foo']?>. </html>
Às vezes você não tem a opção de editar o arquivo php para definir $ _GET com os parâmetros passados, e às vezes você não pode ou não deseja instalar o php-cgi.
Eu achei que essa era a melhor solução para esse caso:
php -r '$_GET["key"]="value"; require_once("script.php");'
Isso evita alterar seu arquivo php e permite que você use o comando php simples. Se você tem o php-cgi instalado, use-o de qualquer maneira, mas esta é a próxima melhor coisa. Achei que essas opções eram dignas de menção
o -r significa executar o código php na sequência a seguir. você define o valor $ _GET manualmente lá e faz referência ao arquivo que deseja executar.
Vale a pena notar que você deve executá-lo na pasta correta, geralmente, mas nem sempre, na pasta em que o arquivo php está. As instruções Requer usarão o local do seu comando para resolver URLs relativos, NÃO o local do arquivo
php file_name.php var1 var2 varN
Em seguida, defina seu $_GET
variáveis em sua primeira linha no PHP, embora essa não seja a maneira desejada de definir uma $_GET
variável e você possa ter problemas dependendo do que você faz posteriormente com essa variável.
if (isset($argv[1])) {
$_GET['variable_name'] = $argv[1];
}
as variáveis com as quais você inicia o script estarão acessíveis a partir da $argv
matriz no seu aplicativo PHP. a primeira entrada será o nome do script de onde eles vieram; portanto, você pode array_shift($argv)
excluir a primeira entrada se quiser processar um monte de variáveis. Ou apenas carregue em uma variável local.
Tente usar WGET
:
WGET 'http://localhost/index.php?a=1&b=2&c=3'
$_GET
implica em um servidor da web em execução.
- Opção 1: php-cgi -
Use 'php-cgi' no lugar de 'php' para executar seu script. Esta é a maneira mais simples, pois você não precisará modificar especialmente seu código php para trabalhar com ele:
php-cgi -f /my/script/file.php a=1 b=2 c=3
- Opção 2: se você possui um servidor web -
Se o arquivo php estiver em um servidor web, você pode usar 'wget' na linha de comando:
wget 'http://localhost/my/script/file.php?a=1&b=2&c=3'
OU:
wget -q -O - "http://localhost/my/script/file.php?a=1&b=2&c=3"
- Acessando as variáveis em php -
Nas opções 1 e 2, você acessa esses parâmetros assim:
$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];
Se você precisa passar $_GET
, $_REQUEST
, $_POST
, ou qualquer outra coisa que você pode também usar o modo interativo PHP:
php -a
Então digite:
<?php
$_GET['a']=1;
$_POST['b']=2;
include("/somefolder/some_file_path.php");
Isso definirá manualmente as variáveis desejadas e, em seguida, executará seu arquivo php com essas variáveis definidas.
Se você tiver a possibilidade de editar o script PHP, poderá preencher artificialmente a matriz $ _GET usando o seguinte código no início do script e, em seguida, chamar o script com a sintaxe: php -f script.php name1=value1 name2=value2
// When invoking the script via CLI like "php -f script.php name1=value1 name2=value2", this code will populate $_GET variables called "name1" and "name2", so a script designed to be called by a web server will work even when called by CLI
if (php_sapi_name() == "cli") {
for ($c = 1; $c < $argc; $c++) {
$param = explode("=", $argv[$c], 2);
$_GET[$param[0]] = $param[1]; // $_GET['name1'] = 'value1'
}
}
Na linha de comando, cole o seguinte
export QUERY_STRING="param1=abc¶m2=xyz" ;
POST_STRING="name=John&lastname=Doe" ; php -e -r
'parse_str($_SERVER["QUERY_STRING"], $_GET); parse_str($_SERVER["POST_STRING"],
$_POST); include "index.php";'
Eu apenas os passo assim:
php5 script.php param1=blabla param2=yadayada
funciona bem, a matriz $ _GET é:
array(3) {
["script_php"]=>
string(0) ""
["param1"]=>
string(6) "blabla"
["param2"]=>
string(8) "yadayada"
}
ou apenas (se você tiver o LYNX):
lynx 'http://localhost/index.php?a=1&b=2&c=3'
php [script name] "a=1&b=2&c=3"
não preencherá o arquivo$_SERVER['QUERY_STRING']
, mas você pode facilmente afetar a mesma coisa fazendo referência$_SERVER['argv'][1]
.