Подтвердить что ты не робот

Передать переменную PHP скрипт, запущенную из командной строки

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

php myfile.php?type=daily

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

php myfile.php daily

и в myfile.php

$type = $argv[1];

Ответ 3

Эти строки преобразуют аргументы вызова 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 для деталей.

Ответ 4

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

php abc.php --name = xyz

abc.php

$val = getopt(null, ["name:"]);
print_r($val); // output: ['name' => 'xyz'];

Ответ 5

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

php myfile.php type=daily

а затем вы можете использовать их как

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

Ответ 6

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

Ответ 8

Вы можете использовать следующий код для работы с командной строкой и веб-браузером. Поместите этот код выше вашего 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;
    }

Ответ 9

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

Ответ 10

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

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

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

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

Ответ 11

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

php test.php one two three

и внутри test.php:

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

Ответ 12

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

Ответ 13

Существует 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, потому что:

Options Синтаксический анализ параметров завершится при первой найденной опции, все, что следует, отбрасывается.

26 Всего 26 параметров в алфавите.


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

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

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

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


Метод 4: STDIN pipe и stream_get_contents()

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


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

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

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

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

Мы можем передавать очень длинные строки, массивы, json, файл конфигурации, содержащий строки параметров, это мощно.

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


Руководство по написанию сценариев