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!

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.


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

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>

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


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.


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'

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

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.


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'
    }
}

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

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"
}

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'


-2

ou apenas (se você tiver o LYNX):

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.