web-dev-qa-db-fra.com

PHP en passant $ _GET à l'invite de commande linux

Disons que nous avons habituellement accès via

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

Comment pouvons-nous exécuter la même invite de commande linux?

php -e index.php

Mais qu'en est-il de passer les variables $ _GET? Peut-être que quelque chose comme php -e index.php --a 1 --b 2 --c 3? Doute que ça va marcher.

Je vous remercie!

118
Patrick

Généralement, pour passer des arguments à un script de ligne de commande, vous utiliserez soit la variable globale argv, 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.

Si vous voulez vraiment peupler $ _GET de toute façon, vous pouvez faire ceci:

// 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é, peupler $_GET à partir 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 faire la même chose avec $_POST et $_COOKIE ainsi que.

118
netcoder

De ceci réponse sur ServerFault :

Utilisez le php-cgi binaire au lieu de 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 ceci dans $_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 suit:

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

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 foo = 123 
 <html> 
 Vous définissez foo à 123. 
 </ html> 
 
% cat test1.php 
 <html> Vous définissez foo sur <? php print $ _GET ['foo']?>. <. /html>
16
Tim Booth
php file_name.php var1 var2 varN

Puis définissez vos variables $_GET Sur votre première ligne en PHP, bien que ce ne soit pas la méthode souhaitée pour définir une variable $_GET Et que vous pourriez rencontrer des problèmes en fonction de ce que vous ferez plus tard avec cette variable.

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

les variables avec lesquelles vous lancez le script seront accessibles à partir du tableau $argv dans votre PHP app. La première entrée indiquera le nom du script d'où elles proviennent, alors vous voudrez peut-être faire une array_shift($argv) pour supprimer cette première entrée si vous voulez traiter un tas de variables, ou simplement charger dans une variable locale.

10
T. Brian Jones

Parfois, vous n'avez pas la possibilité d'éditer le fichier php pour définir $ _GET sur les paramètres transmis, 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 plain php. Si vous avez installé php-cgi, utilisez-le, mais c'est la meilleure chose à faire. Pensé que cette option était digne de mention

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

Il vaut la peine de noter que vous devriez 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.

10

Essayez d'utiliser WGET:

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

- 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'avez pas besoin de modifier spécialement votre code php pour fonctionner avec:

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 options 1 et 2, vous accédez à ces paramètres comme ceci:

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

Si vous avez la possibilité de modifier le script PHP, vous pouvez renseigner artificiellement le tableau $ _GET à l'aide du code suivant au début du script, puis appeler le script avec la syntaxe suivante: 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
lucaferrario

Si vous avez besoin de passer $_GET, $_REQUEST, $_POST, ou toute autre chose que vous pouvez aussi utiliser PHP mode interactif:

php -a

Puis tapez:

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

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

1
makman99

Sur la ligne de commande, collez le texte suivant

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";'
1
Jimmy Moran

Je les passe juste comme ça:

php5 script.php param1=blabla param2=yadayada

fonctionne parfaitement, le tableau $ _GET est:

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