Передайте переменную в php скрипт, запущенный из командной строки

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

php myfile.php?type=daily

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

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

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

15 ответов

Решение

?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 на самом деле содержит достаточно переменных и тому подобное)

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

php myfile.php daily

и в myfile.php

$type = $argv[1];

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

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

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

См. http://php.net/manual/en/function.parse-str.php для получения подробной информации.

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

php abc.php --name = xyz

abc.php

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

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

php myfile.php type=daily

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

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

Сохранить этот код в файле 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,

Чтобы использовать $_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;
    }

Вы можете использовать то, что рекомендует 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'),

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

Этот код не должен использоваться. Прежде всего, CLI, вызываемый как: /usr/bin/php phpscript.php будет иметь одно значение argv, которое является именем скрипта

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

Этот всегда будет выполняться, так как будет иметь 1 или 2 аргументов

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

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

Если вы хотите, чтобы справка распечатала ваши варианты, взгляните на https://github.com/c9s/GetOptionKit

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

php test.php one two three

и внутри test.php:

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

Есть 4 основных альтернативы, у обеих есть свои особенности. На мой взгляд, у метода 4 много преимуществ.


./scriptявляется сценарий оболочки, начиная от#!/usr/bin/php


Метод 1: $argv

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

⚠️ При использовании $argv порядок параметров имеет решающее значение.


Метод 2: getopt ()

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

Трудно использовать вместе с $argv, потому как:

⚠️ Анализ опций завершится на первом найденном не опционе, все последующее отбрасывается.

⚠️ Всего 26 параметров в алфавитном порядке.


Метод 3: глобальная переменная Bash

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

Эти переменные могут использоваться другими программами, работающими в той же оболочке.

Они срабатывают при закрытии оболочки, но не при завершении программы php. Мы можем установить их навсегда~/.bashrc!


Метод 4: канал STDIN и stream_get_contents()

Некоторые примеры трубопроводов:


Подайте строку:

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

Подайте строку с помощью bash echo:

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

Загрузите содержимое файла:

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

Загрузите массив значений:

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

Загрузите json из файла:

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

Он может работать аналогично fread() или fgets(), читая STDIN.


Руководство по сценариям на Bash

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;
        }    
    }
}

Я помещаю параметры в $ _REQUEST

$ _REQUEST [$ key] = $ val;

а также можно использовать напрямую

$$ ключ = $ Вэл

используйте это так:

myFile.php / key = val

Чтобы обойти сложность перехода к файлу, похоже, вы можете использовать sed для вставки строки непосредственно в файл php.

sed -i "i (обратная косая черта) type=dayly myfile.php

      or as I use it with variables:

sed -i "i (обратная косая черта)$type = "(обратная косая черта)"${ежедневно}(обратная косая черта)"(обратная косая черта); ${путь}"/myfile.php"

Я нашел этот vanilla/garden-cli на гитхабе. Я думаю, что он отвечает всем требованиям PHP CLI.

Другие вопросы по тегам