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?
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)
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];
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.
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;
?>
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', )
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
.
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;
}
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
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')
.
<?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
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";
}
}
?>
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