Передайте переменную в php скрипт, запущенный из командной строки - PullRequest
68 голосов
/ 26 июля 2011

У меня есть файл PHP, который необходимо запустить из командной строки (через crontab). Мне нужно передать type=daily в файл, но я не знаю как. Я попробовал:

php myfile.php?type=daily

но эта ошибка была возвращена:

Не удалось открыть входной файл: myfile.php? Type = daily

Что я могу сделать?

Ответы [ 12 ]

117 голосов
/ 26 июля 2011

Аргумент ?type=daily (заканчивающийся в массиве $_GET) действителен только для веб-страниц.

Вам нужно будет назвать его как php myfile.php daily и извлечь этот аргумент из массива $argv (который будет $argv[1], поскольку $argv[0] будет myfile.php).

Если страница также используется в качестве веб-страницы, можно рассмотреть два варианта. Либо получить доступ к нему с помощью сценария оболочки и wget и вызвать его из cron:

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

Или проверьте в php-файле, вызывается ли он из командной строки:

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

(Примечание: вам, вероятно, понадобится / захотите проверить, действительно ли $argv содержит достаточно переменных и тому подобное)

56 голосов
/ 26 июля 2011

Просто передайте его как обычные параметры и получите доступ к нему в PHP с помощью массива $argv.

php myfile.php daily

и в myfile.php

$type = $argv[1];
13 голосов
/ 30 декабря 2016

Эти строки преобразуют аргументы вызова CLI, например php myfile.php "type=daily&foo=bar", в хорошо известный $_GET -array:

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

Несмотря на то, что перезаписать глобальный массив $_GET довольно сложно, он быстро конвертирует все ваши сценарии для принятия аргументов CLI.

Подробнее см. http://php.net/manual/en/function.parse-str.php.

6 голосов
/ 26 июля 2011

параметры отправляются по индексу, как другое приложение

php myfile.php type=daily

, а затем вы можете получить их, как это

<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
    echo $arg;
?>
5 голосов
/ 13 июля 2018

Используя функцию getopt (), мы также можем прочитать параметр из командной строки, просто передав значение с помощью команды запуска php

php abc.php --name = xyz

abc.php

$ val = getopt (null, ["name:"]);
print_r ($ Вэл);
o / p: -
массив ( 'name' => 'xyz', )

4 голосов
/ 15 июля 2016

Сохраните этот код в файле myfile.php и запустите как 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;  
           }
       }
?>

Если вы добавите var_dump($b); перед тегом ?>, вы увидите, что массив $b содержит type => daily.

3 голосов
/ 09 апреля 2018

Вы можете использовать следующий код для работы с командной строкой и веб-браузером. Поместите этот код выше вашего PHP-кода. Он создает переменную $ _GET для каждого параметра командной строки.

В вашем коде вам нужно только проверять переменные $ _GET, не беспокоясь о том, вызывается ли скрипт из веб-браузера или из командной строки.

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 голосов
/ 20 сентября 2016

Я настоятельно рекомендую использовать getopt.

Документация на http://php.net/manual/en/function.getopt.php

Если вы хотите распечатать справку для своих вариантов, взгляните на https://github.com/c9s/GetOptionKit#general-command-interface

2 голосов
/ 21 сентября 2018

Просто передайте его как параметры следующим образом:

php test.php one two three

и внутри test.php:

<?php
if(isset($argv))
{
    foreach ($argv as $arg) 
    {
        echo $arg;
        echo "\r\n";
    }
}
?>
2 голосов
/ 31 июля 2018

Вы можете использовать то, что рекомендует sep16 на php.net :

<?php

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

?>

Он ведет себя точно так же, как вы ожидаете с cgi-php.

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

установит $_GET['type'] на 'daily', $_GET['a'] на '1' и $_GET['b'] на array('2', '3').

...