PHP passant $ _GET dans l'invite de commande Linux


125

Disons que nous accédons généralement via

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

Comment exécuter la même chose dans l'invite de commande Linux?

php -e index.php

Mais qu'en est-il du passage des variables $ _GET? Peut-être quelque chose comme php -e index.php --a 1 --b 2 --c 3? Je doute que cela fonctionne.

Je vous remercie!

Réponses:


122

En règle générale, pour passer des arguments à un script de ligne de commande, vous utiliserez soit argvune variable globale, soit 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 fait référence aux paramètres de la méthode HTTP GET, qui ne sont pas disponibles en ligne de commande, car ils nécessitent un serveur Web pour être renseignés.

Si vous voulez vraiment remplir $ _GET de toute façon, vous pouvez le faire:

// 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
     )
*/

Vous pouvez également exécuter un script donné, le remplir à $_GETpartir de la ligne de commande, sans avoir à modifier ledit script:

export QUERY_STRING="var=value&arg=value" ; \
php -e -r 'parse_str($_SERVER["QUERY_STRING"], $_GET); include "index.php";'

Notez que vous pouvez également faire de même avec $_POSTet $_COOKIE.


1
Il convient de noter que sur notre machine Centos 6 exécutant PHP 5.3, l'appel php [script name] "a=1&b=2&c=3"ne remplira pas le $_SERVER['QUERY_STRING'], mais vous pouvez facilement affecter la même chose en référençant $_SERVER['argv'][1].
Eric L.

4
Essayez cette réponse pour remplir la chaîne de requête à partir de la ligne de commande sans modifier le script PHP.
qris

Ce n'est pas la meilleure réponse. Voir cette autre réponse sur cette page: stackoverflow.com/a/11965479/543738
LS

Réponse utile, bien que si comme moi vous vous demandez ce que sont ces deux-points après les noms d'argument getopt(), cela indique apparemment à PHP que vous voulez l' argument f , pas l' option f (qui serait spécifiée moins les deux points). C'est donc juste de la syntaxe.
Mitya

J'aime vraiment la dernière réponse et je l'ai utilisée hier. Il peut également être transformé en script.
reinierpost

239

À partir de cette réponse sur ServerFault :

Utilisez le php-cgibinaire au lieu de juste php, et passez les arguments sur la ligne de commande, comme ceci:

php-cgi -f index.php left=1058 right=1067 class=A language=English

Ce qui met cela en $_GET:

Array
(
    [left] => 1058
    [right] => 1067
    [class] => A
    [language] => English
)

Vous pouvez également définir des variables d'environnement qui seraient définies par le serveur Web, comme ceci:

REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English

10
+1 et +1: Cette réponse aurait dû être la réponse acceptée. Beaucoup moins de tracas! Pas besoin de changer la source php.
micha

2
Excellent, cela pourrait être facilement encapsulé dans n'importe quel script dépendant du système d'exploitation.
Sebastian

2
+1, solution géniale, je rétroporte actuellement tous mes scripts CLI pour le supporter maintenant;)
ehime

Le seul inconvénient que j'ai vu jusqu'à présent est que la sortie du terminal est HTML avec <br /> plutôt que juste \ n. Cela s'applique également à tous les avis et erreurs, par exemple<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca

+1 Génial, cela fonctionne dans le script normal $ _GET Value For Ex as: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething Works Good ..
Ajmal Praveen

16

Je n'ai pas de binaire php-cgi sur Ubuntu, alors j'ai fait ceci:

% alias php-cgi = "php -r '"' parse_str (implode ("&", array_slice ($ argv, 2)), $ _GET); include ($ argv [1]); '"' -"
% php-cgi test1.php toto = 123
<html>
Vous définissez foo sur 123.
</html>

% cat test1.php
<html> Vous avez défini foo sur <? php print $ _GET ['foo']?>. </html>

On dirait un php-way pour réparer le personnel.
FelikZ

14

Parfois, vous n'avez pas la possibilité d'éditer le fichier php pour définir $ _GET sur les paramètres passés, et parfois vous ne pouvez pas ou ne voulez pas installer php-cgi.

J'ai trouvé que c'était la meilleure solution pour ce cas:

php -r '$_GET["key"]="value"; require_once("script.php");' 

Cela évite de modifier votre fichier php et vous permet d'utiliser la commande php simple. Si vous avez installé php-cgi, utilisez-le certainement, mais c'est la meilleure chose à faire. J'ai pensé que ces options méritaient d'être mentionnées

le -r signifie exécuter le code php dans la chaîne suivante. vous définissez la valeur $ _GET manuellement ici, puis référencez le fichier que vous souhaitez exécuter.

Il est intéressant de noter que vous devez l'exécuter dans le bon dossier, souvent mais pas toujours dans le dossier dans lequel se trouve le fichier php. Les instructions requises utiliseront l'emplacement de votre commande pour résoudre les URL relatives, PAS l'emplacement du fichier


1
Je tiens à vous remercier pour cette solution. À mon avis, cela devrait être la réponse acceptée. Vous n'avez pas besoin d'installer une bibliothèque supplémentaire pour l'utiliser.
swordsecurity

C'est bien mieux que la réponse acceptée. Upvote pour vous!
faraday703

solution géniale et facile!
derRobert

Réponse géniale. Il vous manque juste un guillemet de fin dans votre code :)
Pedro Araujo Jorge

10
php file_name.php var1 var2 varN

Ensuite, définissez vos $_GETvariables sur votre première ligne en PHP, bien que ce ne soit pas la manière souhaitée de définir une $_GETvariable et que vous puissiez rencontrer des problèmes en fonction de ce que vous faites plus tard avec cette variable.

if (isset($argv[1])) {
   $_GET['variable_name'] = $argv[1];
}

les variables avec lesquelles vous lancez le script seront accessibles depuis le $argvtableau de votre application PHP. la première entrée sera le nom du script dont ils proviennent, vous pouvez donc vouloir array_shift($argv)supprimer cette première entrée si vous voulez traiter un tas de variables. Ou simplement charger dans une variable locale.


la solution la plus simple et la plus simple
João Pimentel Ferreira

9

Essayez d'utiliser WGET:

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

1
Vous voudriez mettre l'URL entre guillemets simples, comme le? et & dans la partie de requête se trouvent des métacaractères shell (caractère générique unique + "exécuter cette commande en arrière-plan").
Marc B

7
Cela fonctionnera, mais nécessite un serveur Web en cours d'exécution et rend l'ensemble du processus un peu plus inefficace que nécessaire.
Brad

C'est le cas, mais $_GETimplique généralement un serveur Web en cours d'exécution.
quickshift du

6

- Option 1: php-cgi -

Utilisez «php-cgi» à la place de «php» pour exécuter votre script. C'est le moyen le plus simple car vous n'aurez pas besoin de modifier spécialement votre code php pour travailler avec lui:

php-cgi -f /my/script/file.php a=1 b=2 c=3

- Option 2: si vous avez un serveur Web -

Si le fichier php est sur un serveur Web, vous pouvez utiliser 'wget' sur la ligne de commande:

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"

- Accéder aux variables en php -

Dans les deux options 1 et 2, vous accédez à ces paramètres comme ceci:

$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];

2

Si vous devez passer $_GET, $_REQUEST, $_POSTou tout ce que vous pouvez également utiliser le mode interactif PHP:

php -a

Tapez ensuite:

<?php
$_GET['a']=1;
$_POST['b']=2;
include("/somefolder/some_file_path.php");

Cela définira manuellement toutes les variables souhaitées, puis exécutera votre fichier php avec ces variables définies.


1

Si vous avez la possibilité d'éditer le script PHP, vous pouvez remplir artificiellement le tableau $ _GET en utilisant le code suivant au début du script, puis appeler le script avec la syntaxe: 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

Sur la ligne de commande, collez ce qui suit

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

Je les passe juste comme ça:

php5 script.php param1=blabla param2=yadayada

fonctionne très bien, le tableau $ _GET est:

array(3) {
  ["script_php"]=>
  string(0) ""
  ["param1"]=>
  string(6) "blabla"
  ["param2"]=>
  string(8) "yadayada"
}

viens de découvrir que cela fonctionne sur mon serveur d'hébergement, mais pas sur mon serveur local, bizarre.
Asaf

Peut-être une différence dans la version installée? Sur quelle version cela a-t-il fonctionné pour vous et sur quelle version a-t-il échoué?
Kzqai

php 5.2 sur l'hébergement, fonctionne, 5.3 localement n'a pas d'importance ... peu importe je l'ai fait à la manière $ argv juste au cas où $ _GET serait vide
Asaf

-1

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

Vous pouvez créer la première partie en tant qu'alias:

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

puis utilisez simplement:

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


-2

ou simplement (si vous avez LYNX):

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

3
Cela n'exécute pas PHP à partir de la ligne de commande. Cela exécute un navigateur qui appelle le serveur Web via la ligne de commande.
Andrea Lazzarotto
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.