PHP passando $ _GET no prompt de comando do linux

125

Digamos que geralmente acessamos via

http://localhost/index.php?a=1&b=2&c=3

Como executamos o mesmo no prompt de comando linux?

php -e index.php

Mas e quanto a passar as variáveis ​​$ _GET? Talvez algo como php -e index.php --a 1 --b 2 --c 3? Duvido que funcione.

Obrigado!

Patrick
fonte

Respostas:

122

Normalmente, para passar argumentos para um script de linha de comando, você usará argva 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 $_GETpartir 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 $_POSTe $_COOKIEtambém.

codificador de rede
fonte
1
Vale a pena notar que, em nossa máquina Centos 6 executando o PHP 5.3, a chamada 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].
Eric L.
4
Tente esta resposta para preencher a string de consulta na linha de comando sem modificar o script PHP.
QRIS
Esta não é a melhor resposta. Veja esta outra resposta nesta página: stackoverflow.com/a/11965479/543738
LS
Resposta útil, embora se, como eu, você esteja se perguntando em que esses dois pontos estão os nomes dos argumentos 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.
Mitya
Gosto muito da última resposta e a usei ontem. Também pode ser transformado em um script.
Reinierpost
239

Desta resposta no ServerFault :

Use o php-cgibinário em vez de apenas phpe 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
qris
fonte
10
+1 e +1: esta resposta deveria ter sido a resposta aceita. Muito menos aborrecimentos! Não há necessidade de alterar a fonte php.
micha
2
Excelente, isso pode ser facilmente envolvido em qualquer script dependente do SO.
12133 Sebastian
2
+1, solução incrível, eu estou atualmente backporting todos os meus scripts CLI para suportar isso agora;)
ehime
A única desvantagem que eu vi até agora é que a saída do terminal é HTML com <br /> em vez de apenas \ n. Isso se aplica a todos os avisos e erros também, por exemplo:<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca
+1 impressionantes, isso funciona em Normal Script $ _GET Valor Para Ex como: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething funciona bem ..
Ajmal Praveen
16

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>
Tim Booth
fonte
Parece uma maneira php para consertar funcionários.
FelikZ #
14

À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

derrick o branco
fonte
1
Quero agradecer por esta solução. Na minha opinião, essa deve ser a resposta aceita. Você não precisa instalar uma biblioteca extra para usá-lo.
swordsecurity
Isso é muito melhor do que a resposta aceita. Voto a favor para você!
precisa saber é o seguinte
solução impressionante e fácil!
DerRobert 14/08/19
Resposta incrível. Você só está faltando uma citação final em seu código :)
Pedro Araujo Jorge
10
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 $_GETvariá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 $argvmatriz 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.

T. Brian Jones
fonte
a solução mais fácil e simples
João Pimentel Ferreira
9

Tente usar WGET:

WGET 'http://localhost/index.php?a=1&b=2&c=3'
Giuseppe Accaputo
fonte
1
Você gostaria de colocar o URL entre aspas simples, como o? e & na parte da consulta são metacaracteres do shell (caractere curinga de caractere único + "execute este comando em segundo plano").
Marc B
7
Isso funcionará, mas requer um servidor Web em execução e torna todo o processo um pouco mais ineficiente do que o necessário.
Brad
Sim, mas normalmente $_GETimplica em um servidor da web em execução.
quickshiftin
6

- 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"];
Bastião
fonte
2

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.

makman99
fonte
1

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'
    }
}
lucaferrario
fonte
1

Na linha de comando, cole o seguinte

export QUERY_STRING="param1=abc&param2=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";'
Jimmy Moran
fonte
0

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"
}
Asaf
fonte
acabei de descobrir que isso funciona no meu servidor de hospedagem, mas não no meu servidor local, esquisito.
Asaf
Talvez uma diferença na versão instalada? Qual versão funcionou para você e qual falhou?
21412 Kzqai
php 5.2 na hospedagem, obras, 5,3 localmente não ... não importa eu fiz isso da maneira $ argv apenas no caso de o $ _GET está vazia
Asaf
-1

php -r 'parse_str($argv[2],$_GET);include $argv[1];' index.php 'a=1&b=2'

Você pode fazer a primeira parte como um alias:

alias php-get='php -r '\''parse_str($argv[2],$_GET);include $argv[1];'\'

então simplesmente use:

php-get some_script.php 'a=1&b=2&c=3'

Miau
fonte
-2

ou apenas (se você tiver o LYNX):

lynx 'http://localhost/index.php?a=1&b=2&c=3'
quardas
fonte
3
Isso não executa o PHP na linha de comando. Isso executa um navegador que chama o servidor da web através da linha de comando.
Andrea Lazzarotto