web-dev-qa-db-fra.com

Passer la variable au script php en cours d'exécution à partir de la ligne de commande

J'ai un fichier PHP qui doit être exécuté à partir de la ligne de commande (via crontab). Je dois passer type=daily au fichier mais je ne sais pas comment. J'ai essayé:

php myfile.php?type=daily

mais cette erreur a été renvoyée:

Impossible d'ouvrir le fichier d'entrée: myfile.php? Type = daily

Que puis-je faire?

59
hd.

L'argument ?type=daily (se terminant dans le tableau $_GET) n'est valide que pour les pages accessibles via le Web. 

Vous devrez l'appeler comme php myfile.php daily et extraire cet argument du tableau $argv (qui serait $argv[1], puisque $argv[0] serait myfile.php).

Si la page est également utilisée comme page Web, vous pouvez envisager deux options. Soit y accéder avec un script shell et wget et appeler cela depuis cron:

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

Ou vérifiez dans le fichier php s'il est appelé depuis la ligne de commande ou non:

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

(Remarque: vous aurez probablement besoin de vérifier si $argv contient suffisamment de variables, par exemple)

112
PtPazuzu

Il suffit de le passer comme paramètre normal et d'y accéder dans PHP en utilisant le tableau $argv.

php myfile.php daily

et dans myfile.php

$type = $argv[1];
51
ChrFin

Ces lignes vont convertir les arguments d'un appel CLI tel que php myfile.php "type=daily&foo=bar" dans le tableau $_GET- bien connu:

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

Bien qu'il soit plutôt compliqué d'écraser le tableau global $_GET-, tous vos scripts sont rapidement convertis pour accepter les arguments CLI.

Voir http://php.net/manual/en/function.parse-str.php pour plus de détails.

12
fboes

paramètres envoyés par index comme une autre application

php myfile.php type=daily

et alors vous pouvez les gat comme ça

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

En utilisant la fonction getopt (), nous pouvons également lire le paramètre depuis la ligne de commande, il suffit de passer la valeur avec la commande courante php

php abc.php --name = xyz

abc.php

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

5
RSW

Enregistrez ce code dans le fichier myfile.php et exécutez-le en tant que php 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;  
           }
       }
?>

Si vous ajoutez var_dump($b); avant la balise ?>, vous constaterez que le tableau $b contient type => daily.

4
easyaspi

Vous pouvez utiliser le code suivant pour utiliser la ligne de commande et le navigateur Web. Mettez ce code ci-dessus de votre code php. Il crée une variable $ _GET pour chaque paramètre de ligne de commande.

Dans votre code, il vous suffit alors de vérifier les variables $ _GET, sans vous soucier de savoir si le script est appelé depuis le navigateur Web ou en ligne de commande.

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

Je recommande fortement l'utilisation de getopt.

Documentation sur http://php.net/manual/en/function.getopt.php

Si vous souhaitez que l’aide apparaisse dans vos options, jetez un coup d’œil à https://github.com/c9s/GetOptionKit#general-command-interface

3
Francisco Luz

Vous pouvez utiliser ce que sep16 sur php.net recommande :

<?php

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

?>

Il se comporte exactement comme vous le souhaiteriez avec cgi-php.

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

définira $_GET['type'] sur 'daily', $_GET['a'] sur '1' et $_GET['b'] sur array('2', '3').

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

Ce code ne doit pas être utilisé. Tout d'abord, la CLI appelée comme:/usr/bin/php phpscript.php aura une valeur argv qui sera le nom du script

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

Celui-ci sera toujours exécuté car aura 1 ou 2 arguments

2
Grzegorz

Il suffit de le passer comme paramètres comme suit: 

php test.php one two three

et à l'intérieur de 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;
        }    
    }
}

Je mets des paramètres dans $ _REQUEST 

$ _REQUEST [$ key] = $ val;

et aussi utilisable directement 

$$ clé = $ val

utilisez ceci comme ça: 

myFile.php/key = val

0
emmanuel