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!

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.


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

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>

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


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.


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'

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

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.


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

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

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

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'


-2

oder einfach (wenn Sie LYNX haben):

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.