Übergeben Sie die Variable an das PHP-Skript, das über die Befehlszeile ausgeführt wird

74

Ich habe eine PHP-Datei, die über die Befehlszeile (über crontab) ausgeführt werden muss. Ich muss an type=dailydie Datei übergeben, weiß aber nicht wie. Ich habe es versucht:

php myfile.php?type=daily

aber dieser Fehler wurde zurückgegeben:

Eingabedatei konnte nicht geöffnet werden: myfile.php? Type = daily

Was kann ich tun?

hd.
quelle

Antworten:

130

Das ?type=dailyArgument (das im $_GETArray endet ) gilt nur für Seiten, auf die über das Internet zugegriffen wird.

Sie müssen es so nennen php myfile.php dailyund dieses Argument aus dem $argvArray abrufen (was wäre $argv[1], da $argv[0]wäre myfile.php).

Wenn die Seite auch als Webseite verwendet wird, können Sie zwei Optionen in Betracht ziehen. Entweder mit einem Shell-Skript darauf zugreifen und das von cron aus wget und aufrufen:

#!/bin/sh
wget http://location.to/myfile.php?type=daily

Oder überprüfen Sie in der PHP-Datei, ob sie über die Befehlszeile aufgerufen wird oder nicht:

if (defined('STDIN')) {
  $type = $argv[1];
} else { 
  $type = $_GET['type'];
}

(Hinweis: Sie müssen / möchten wahrscheinlich überprüfen, ob $argvtatsächlich genügend Variablen und dergleichen enthalten sind.)

PtPazuzu
quelle
2
Empfohlener Weg ist die Verwendung von getopt ()
ViliusL
63

Übergeben Sie es einfach als normale Parameter und greifen Sie mit dem $argvArray in PHP darauf zu .

php myfile.php daily

und in myfile.php

$type = $argv[1];
Christoph Fink
quelle
3
Verwenden Sie: if (isset ($ argv [1])) {echo. $ argv [1]; } else {die ('nein!'); }
Demenvil
17

Diese Zeilen konvertieren die Argumente eines CLI-Aufrufs wie folgt php myfile.php "type=daily&foo=bar"in das bekannte $_GET-array:

if (!empty($argv[1])) {
  parse_str($argv[1], $_GET);
}

Das Überschreiben des globalen $_GETArrays ist zwar ziemlich umständlich, konvertiert jedoch alle Ihre Skripte schnell, um CLI-Argumente zu akzeptieren.

Weitere Informationen finden Sie unter http://php.net/manual/en/function.parse-str.php .

fboes
quelle
Perfekte Antwort! Vielen Dank!
Reado
7

Mit der Funktion getopt () können wir auch Parameter aus der Befehlszeile lesen, indem wir den Wert einfach mit dem Befehl php running übergeben

php abc.php --name = xyz

abc.php

$val = getopt(null, ["name:"]);
print_r($val); // output: ['name' => 'xyz'];
Rupesh Wankhede
quelle
6

Parameter werden wie andere Anwendungen per Index gesendet

php myfile.php type=daily

und dann können Sie sie so gat

<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
    echo $arg;
?>
Subdigger
quelle
3
das ist nicht wirklich praktisch, es trennt nicht den Schlüssel und den Wert, es übergibt nur den Wert "type = daily"
spybart
4

Sie können den nächsten Code verwenden, um mit der Befehlszeile und dem Webbrowser zu arbeiten. Setzen Sie diesen Code über Ihren PHP-Code. Es wird eine Variable $ _GET für jeden Befehlszeilenparameter erstellt.

In Ihrem Code müssen Sie dann nur nach $ _GET-Variablen suchen, ohne sich Gedanken darüber machen zu müssen, ob das Skript über den Webbrowser oder die Befehlszeile aufgerufen wird.

if(isset($argv))
    foreach ($argv as $arg) {
        $e=explode("=",$arg);
        if(count($e)==2)
            $_GET[$e[0]]=$e[1];
        else    
            $_GET[$e[0]]=0;
    }
hamboy75
quelle
4

Speichern Sie diesen Code in einer Datei myfile.phpund führen Sie ihn als ausphp myfile.php type=daily

<?php
$a = $argv;
$b = array();
if (count($a) === 1) exit;
foreach ($a as $key => $arg) {
    if ($key > 0) {
        list($x,$y) = explode('=', $arg);
        $b["$x"] = $y;  
    }
}
?>

Wenn Sie var_dump($b);vor dem ?>Tag hinzufügen , sehen Sie, dass das Array $benthält type => daily.

easyaspi
quelle
1
Während dies die Frage beantworten kann, sollten Sie Details hinzufügen, wie diese Lösung das Problem löst. Bitte beziehen Sie sich auf stackoverflow.com/help/how-to-answer .
J. Chomel
Speichern Sie diesen Code in der Datei myfile.php und führen Sie ihn als 'php myfile.php type = daily' aus, wenn Sie var_dump ($ b) hinzufügen. Vor dem Tag?> sehen Sie, dass das Array $ b den Typ => daily enthält.
easyaspi
3

Sie können verwenden, was sep16 auf php.net empfiehlt :

<?php

parse_str(implode('&', array_slice($argv, 1)), $_GET);

?>

Es verhält sich genau so, wie Sie es von cgi-php erwarten würden.

$ php -f myfile.php type=daily a=1 b[]=2 b[]=3

wird $_GET['type']auf 'daily', $_GET['a']zu '1'und $_GET['b']zu gesetzt array('2', '3').

K3 --- rnc
quelle
2
<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
echo $arg;
?>

Dieser Code sollte nicht verwendet werden. Zunächst wird die CLI wie folgt aufgerufen: / usr / bin / php phpscript.php hat einen argv-Wert, der den Namen des Skripts darstellt

array(2) {
   [0]=>
   string(13) "phpscript.php"
}

Dieser wird immer ausgeführt, da 1 oder 2 Argumente vorhanden sind

Grzegorz
quelle
2

Übergeben Sie es einfach wie folgt als Parameter:

php test.php one two three

und in test.php:

<?php
if(isset($argv))
{
    foreach ($argv as $arg) 
    {
        echo $arg;
        echo "\r\n";
    }
}
?>
Sam Prasad
quelle
1

Es gibt 4 Hauptalternativen, beide haben ihre Macken, Methode 4 hat aus meiner Sicht viele Vorteile.


./scriptist ein Shell-Skript, das mit beginnt#!/usr/bin/php


Methode 1: $ argv

./script hello wo8844rld
// $argv[0] = "script", $argv[1] = "hello", $argv[2] = "wo8844rld"   

⚠️ Bei Verwendung von $ argv ist die Reihenfolge der Parameter kritisch.


Methode 2: getopt ()

./script -p7 -e3
// getopt("p::")["p"] = "7", getopt("e::")["e"] = "3"

Es ist schwer in Verbindung zu verwenden $argv, weil:

⚠️ Das Parsen von Optionen endet mit der ersten gefundenen Nichtoption. Alles, was folgt, wird verworfen.

⚠️ Nur 26 Parameter als Alphabet.


Methode 3: Bash Globale Variable

P9="xptdr" ./script
// getenv("P9") = "xptdr"
// $_SERVER["P9"] = "xptdr"

Diese Variablen können von anderen Programmen verwendet werden, die in derselben Shell ausgeführt werden.

Sie werden geblasen, wenn die Shell geschlossen wird, aber nicht, wenn das PHP-Programm beendet wird. Wir können sie dauerhaft einsetzen ~/.bashrc!


Methode 4: STDIN- Pipe und stream_get_contents ()

Einige Rohrleitungsbeispiele:


Füttere einen String:

./script <<< "hello wo8844rld"
// stream_get_contents(STDIN) = "hello wo8844rld"

Füttere einen String mit Bash Echo:

echo "hello wo8844rld" | ./script
// explode(" ",stream_get_contents(STDIN)) ...

Füttere einen Dateiinhalt:

./script < ~/folder/Special_params.txt
// explode("\n",stream_get_contents(STDIN)) ...

Füttere ein Array von Werten:

./script <<< '["array entry","lol"]'
// var_dump( json_decode(trim(stream_get_contents(STDIN))) );

Füttere einen JSON aus einer Datei:

echo params.json | ./script
// json_decode(stream_get_contents(STDIN)) ...

Es funktioniert möglicherweise ähnlich wie fread () oder fgets () , indem Sie die STDIN lesen.


Bash-Scripting-Anleitung

NVRM
quelle
0
if (isset($argv) && is_array($argv)) {
    $param = array();
    for ($x=1; $x<sizeof($argv);$x++) {
        $pattern = '#\/(.+)=(.+)#i';
        if (preg_match($pattern, $argv[$x])) {
            $key =  preg_replace($pattern, '$1', $argv[$x]); 
            $val =  preg_replace($pattern, '$2', $argv[$x]);
            $_REQUEST[$key] = $val;
            $$key = $val;
        }    
    }
}

Ich habe Parameter in $ _REQUEST eingefügt

$ _REQUEST [$ key] = $ val;

und auch direkt verwendbar

$$ key = $ val

benutze das so:

myFile.php / key = val

Emmanuel
quelle