PHP übergibt $ _GET an der Linux-Eingabeaufforderung

125

Angenommen, wir greifen normalerweise über zu

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

Wie führen wir dasselbe in der Linux-Eingabeaufforderung aus?

php -e index.php

Aber was ist mit der Übergabe der $ _GET-Variablen? Vielleicht so etwas wie php -e index.php --a 1 --b 2 --c 3? Zweifel, dass das funktionieren wird.

Danke dir!

Patrick
quelle

Antworten:

122

Zum Übergeben von Argumenten an ein Befehlszeilenskript verwenden Sie normalerweise entweder eine argvglobale Variable oder 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 bezieht sich auf die Parameter der HTTP-GET-Methode, die in der Befehlszeile nicht verfügbar sind, da zum Auffüllen ein Webserver erforderlich ist.

Wenn Sie $ _GET trotzdem wirklich füllen möchten, können Sie dies tun:

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

Sie können auch ein bestimmtes Skript ausführen, das $_GETüber die Befehlszeile ausgefüllt wird, ohne das Skript ändern zu müssen:

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

Beachten Sie, dass Sie dasselbe auch mit $_POSTund tun können $_COOKIE.

Netcoder
quelle
1
Es ist erwähnenswert, dass auf unserem Centos 6-Computer, auf dem PHP 5.3 ausgeführt wird, das Aufrufen php [script name] "a=1&b=2&c=3"das nicht auffüllt $_SERVER['QUERY_STRING'], aber Sie können das Gleiche leicht durch Verweisen beeinflussen $_SERVER['argv'][1].
Eric L.
4
Versuchen Sie diese Antwort , um die Abfragezeichenfolge über die Befehlszeile zu füllen, ohne das PHP-Skript zu ändern.
Qris
Dies ist nicht die beste Antwort. Siehe diese andere Antwort auf dieser Seite: stackoverflow.com/a/11965479/543738
LS
Hilfreiche Antwort: Wenn Sie sich wie ich fragen, wie diese Doppelpunkte nach den Argumentnamen lauten getopt(), sagt dies PHP anscheinend, dass Sie das Argument f und nicht die Option f (die ohne den Doppelpunkt angegeben werden soll) möchten. Es ist also nur Syntax.
Mitya
Die letzte Antwort gefällt mir sehr gut und ich habe sie gestern verwendet. Es kann auch in ein Skript umgewandelt werden.
Reinierpost
239

Aus dieser Antwort auf ServerFault :

Verwenden Sie die php-cgiBinärdatei anstelle von nur phpund übergeben Sie die Argumente in der Befehlszeile wie folgt:

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

Was bringt das in $_GET:

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

Sie können auch Umgebungsvariablen festlegen, die vom Webserver festgelegt werden, wie folgt:

REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
qris
quelle
10
+1 und +1: Diese Antwort sollte die akzeptierte Antwort gewesen sein. Viel weniger Ärger! Keine Notwendigkeit, die PHP-Quelle zu ändern.
Micha
2
Hervorragend, dies kann leicht in jedes betriebssystemabhängige Skript eingebunden werden.
Sebastian
2
+1, tolle Lösung, ich portiere derzeit alle meine CLI-Skripte zurück, um dies jetzt zu unterstützen;)
ehime
Der einzige Nachteil, den ich bisher gesehen habe, ist, dass die Terminalausgabe HTML mit <br /> und nicht nur \ n ist. Dies gilt auch für alle Hinweise und Fehler, zB<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca
+1 Awesome, Dies funktioniert in normaler Schrift $ _GET Wert für Ex als: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething Funktioniert gut ..
Ajmal Praveen
16

Ich habe keine PHP-CGI-Binärdatei unter Ubuntu, also habe ich Folgendes getan:

% alias php-cgi = "php -r '"' parse_str (implode ("&", array_slice ($ argv, 2)), $ _GET); include ($ argv [1]); '"' -"
% php-cgi test1.php foo = 123
<html>
Sie setzen foo auf 123.
</ html>

% cat test1.php
<html> Sie setzen foo auf <? php print $ _GET ['foo']?>. </ html>
Tim Booth
quelle
Sieht aus wie ein PHP-Weg, um Mitarbeiter zu reparieren.
FelikZ
14

Manchmal haben Sie nicht die Möglichkeit, die PHP-Datei zu bearbeiten, um $ _GET auf die übergebenen Parameter zu setzen, und manchmal können oder wollen Sie PHP-CGI nicht installieren.

Ich fand, dass dies die beste Lösung für diesen Fall ist:

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

Dadurch wird vermieden, dass Ihre PHP-Datei geändert wird, und Sie können den einfachen PHP-Befehl verwenden. Wenn Sie PHP-CGI installiert haben, verwenden Sie dies auf jeden Fall, aber dies ist das nächstbeste. Ich dachte, diese Option wäre erwähnenswert

das -r bedeutet, den PHP-Code in der folgenden Zeichenfolge auszuführen. Dort legen Sie den Wert $ _GET manuell fest und verweisen dann auf die Datei, die Sie ausführen möchten.

Es ist erwähnenswert, dass Sie dies im richtigen Ordner ausführen sollten, häufig, aber nicht immer in dem Ordner, in dem sich die PHP-Datei befindet. Requires-Anweisungen verwenden den Speicherort Ihres Befehls, um relative URLs aufzulösen, NICHT den Speicherort der Datei

Derrick der Weiße
quelle
1
Ich möchte mich bei Ihnen für diese Lösung bedanken. Meiner Meinung nach sollte dies die akzeptierte Antwort sein. Sie müssen keine zusätzliche Bibliothek installieren, um sie zu verwenden.
Schwertsicherheit
Dies ist viel besser als die akzeptierte Antwort. Upvote für Sie!
Faraday703
tolle und einfache Lösung!
derRobert
Tolle Antwort. Sie vermissen nur ein
Pedro Araujo Jorge
10
php file_name.php var1 var2 varN

Setzen Sie dann Ihre $_GETVariablen in Ihrer ersten Zeile in PHP, obwohl dies nicht die gewünschte Methode zum Festlegen einer $_GETVariablen ist und Sie möglicherweise Probleme haben, je nachdem, was Sie später mit dieser Variablen tun.

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

Auf die Variablen, mit denen Sie das Skript starten, kann über das $argvArray in Ihrer PHP-App zugegriffen werden. Der erste Eintrag enthält den Namen des Skripts, aus dem sie stammen. array_shift($argv)Wenn Sie eine Reihe von Variablen verarbeiten möchten, können Sie diesen ersten Eintrag löschen. Oder laden Sie einfach in eine lokale Variable.

T. Brian Jones
quelle
die einfachste und einfachste Lösung
João Pimentel Ferreira
9

Versuchen Sie es mit WGET:

WGET 'http://localhost/index.php?a=1&b=2&c=3'
Giuseppe Accaputo
quelle
1
Sie möchten die URL in einfache Anführungszeichen setzen, als? und & im Abfrageteil sind Shell-Metazeichen (Einzelzeichen-Platzhalter + "Führen Sie diesen Befehl im Hintergrund aus").
Marc B
7
Dies funktioniert, erfordert jedoch einen laufenden Webserver und macht den gesamten Prozess ein bisschen ineffizienter als erforderlich.
Brad
Dies ist der Fall, $_GETimpliziert jedoch normalerweise einen laufenden Webserver.
Quickshiftin
6

- Option 1: php-cgi -

Verwenden Sie 'php-cgi' anstelle von 'php', um Ihr Skript auszuführen. Dies ist der einfachste Weg, da Sie Ihren PHP-Code nicht speziell ändern müssen, um damit zu arbeiten:

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

- Option 2: Wenn Sie einen Webserver haben -

Wenn sich die PHP-Datei auf einem Webserver befindet, können Sie 'wget' in der Befehlszeile verwenden:

wget 'http://localhost/my/script/file.php?a=1&b=2&c=3'

ODER:

wget -q -O - "http://localhost/my/script/file.php?a=1&b=2&c=3"

- Zugriff auf die Variablen in PHP -

In beiden Optionen 1 und 2 greifen Sie auf folgende Parameter zu:

$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];
Bastion
quelle
2

Wenn Sie übergeben müssen $_GET, $_REQUEST, $_POST, oder irgendetwas anderes können Sie auch PHP interaktiven Modus verwenden:

php -a

Geben Sie dann Folgendes ein:

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

Dadurch werden alle gewünschten Variablen manuell festgelegt und anschließend Ihre PHP-Datei mit diesen festgelegten Variablen ausgeführt.

makman99
quelle
1

Wenn Sie die Möglichkeit haben, das PHP-Skript zu bearbeiten, können Sie das $ _GET-Array mit dem folgenden Code am Anfang des Skripts künstlich füllen und das Skript dann mit der Syntax aufrufen: 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
quelle
1

Fügen Sie in der Befehlszeile Folgendes ein

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
quelle
0

Ich passiere sie einfach so:

php5 script.php param1=blabla param2=yadayada

funktioniert einwandfrei, das $ _GET-Array lautet:

array(3) {
  ["script_php"]=>
  string(0) ""
  ["param1"]=>
  string(6) "blabla"
  ["param2"]=>
  string(8) "yadayada"
}
Asaf
quelle
Ich habe gerade herausgefunden, dass dies auf meinem Hosting-Server funktioniert, aber nicht auf meinem lokalen Server.
Asaf
Vielleicht ein Unterschied in der installierten Version? Bei welcher Version hat das für Sie funktioniert und bei welcher ist es fehlgeschlagen?
Kzqai
PHP 5.2 auf Hosting, funktioniert, 5.3 lokal nicht ... spielt keine Rolle, ich habe es auf die $ argv Weise getan, nur für den Fall, dass das $ _GET leer ist
Asaf
-1

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

Sie könnten den ersten Teil als Alias ​​machen:

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

dann benutze einfach:

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

Miau
quelle
-2

oder einfach (wenn Sie LYNX haben):

lynx 'http://localhost/index.php?a=1&b=2&c=3'
Quardas
quelle
3
Dies führt PHP nicht über die Befehlszeile aus. Dadurch wird ein Browser ausgeführt, der den Webserver über die Befehlszeile aufruft.
Andrea Lazzarotto