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.