it-swarm.com.de

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

Ich habe eine PHP -Datei, die von der Befehlszeile (über Crontab) ausgeführt werden muss. Ich muss type=daily an die Datei übergeben, aber ich weiß 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 machen?

59
hd.

Das ?type=daily-Argument (das im $_GET-Array endet) gilt nur für Seiten, auf die über das Internet zugegriffen wird. 

Sie müssen es wie php myfile.php daily aufrufen und dieses Argument aus dem $argv-Array abrufen (dies wäre $argv[1], da $argv[0]myfile.php wäre).

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

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

Oder prüfen Sie in der PHP-Datei, ob sie von der Kommandozeile aus aufgerufen wird oder nicht:

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

(Hinweis: Möglicherweise müssen/möchten Sie prüfen, ob $argv tatsächlich genügend Variablen und solche enthält.)

112
PtPazuzu

Übergeben Sie es einfach als normale Parameter und greifen Sie in PHP über das $argv-Array zu.

php myfile.php daily

und in myfile.php

$type = $argv[1];
51
ChrFin

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

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

Das globale $_GET- Array zu überschreiben ist zwar ziemlich unordentlich, konvertiert jedoch all Ihre Skripts schnell in CLI-Argumente.

Siehe http://php.net/manual/de/function.parse-str.php für Einzelheiten.

12
fboes

parameter senden wie andere Anwendungen über den Index

php myfile.php type=daily

und dann kannst du sie so machen

<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
    echo $arg;
?>
6
Subdigger

Mit der getopt () - Funktion können wir Parameter auch von der Befehlszeile aus lesen

php abc.php --name = xyz

abc.php

$ val = getopt (null, ["name:"]);
print_r ($ val);
o/p: -
array ( 'name' => 'xyz', )

5
RSW

Speichern Sie diesen Code in der Datei myfile.php und führen Sie ihn als php myfile.php type=daily aus.

<?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 $btype => daily enthält.

4
easyaspi

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

In Ihrem Code müssen Sie dann nur nach $ _GET-Variablen suchen und sich keine Gedanken darüber machen, 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;
    }
3
hamboy75

Ich empfehle dringend die Verwendung von getopt.

Dokumentation unter http://php.net/manual/de/function.getopt.php

Wenn Sie die Hilfe ausdrucken möchten, werfen Sie einen Blick auf https://github.com/c9s/GetOptionKit#general-command-interface .

3
Francisco Luz

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

<?php

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

?>

Es verhält sich genau so, wie man es von cgi-php erwartet.

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

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

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

Dieser Code sollte nicht verwendet werden. Zunächst einmal heißt die CLI wie folgt:/usr/bin/php phpscript.php hat einen argv-Wert, der der Name des Skripts ist

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

Dieser wird immer ausgeführt, da er 1 oder 2 Pässe haben wird

2
Grzegorz

Übergeben Sie es einfach als Parameter wie folgt: 

php test.php one two three

und in test.php:

<?php
if(isset($argv))
{
    foreach ($argv as $arg) 
    {
        echo $arg;
        echo "\r\n";
    }
}
?>
2
Sam Prasad
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 gesetzt 

$ _REQUEST [$ key] = $ val;

und auch direkt verwendbar 

$$ key = $ val

benutze das so: 

myFile.php/key = val

0
emmanuel