Передайте змінну в php-скрипт, що працює з командного рядка


76

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

php myfile.php?type=daily

але ця помилка була повернута:

Не вдалося відкрити вхідний файл: myfile.php? Type = daily

Що я можу зробити?

Відповіді:


131

?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насправді містить достатньо змінних тощо)


2
Рекомендований спосіб - використовувати getopt ()
ViliusL

Що робить визначений ('STDIN')?
CodeForGood

64

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

php myfile.php daily

та у myfile.php

$type = $argv[1];

3
Використовуйте: if (isset ($ argv [1])) {echo. $ argv [1]; } ще {померти ('ні!'); }
demenvil

17

Ці рядки перетворять аргументи виклику 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 .


Ідеальна відповідь! Дякую!
Редо

8

За допомогою функції getopt () ми також можемо прочитати параметр із командного рядка, просто передавши значення за допомогою запущеної команди php

php abc.php --name = xyz

abc.php

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

6

параметри надсилаються за індексом, як інший додаток

php myfile.php type=daily

а потім ви можете отримати їх так

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

3
це насправді не так зручно, він не відокремлює ключ і значення, він просто передає значення "type = daily"
spybart

5

Збережіть цей код у файлі 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.


1
Незважаючи на те, що це може відповісти на запитання, подумайте про додавання деталей про те, як це рішення вирішує проблему. Будь ласка, зверніться до stackoverflow.com/help/how-to-answer .
J. Chomel

Збережіть цей код у файлі myfile.php і запустіть як 'php myfile.php type = daily', якщо ви додасте var_dump ($ b); перед тегом?> ви побачите, що масив $ b містить type => daily.
easyaspi

4

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



2
<?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 аргументи pass


2

Просто передайте його як параметри наступним чином:

php test.php one two three

і всередині test.php:

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

1

Є 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, оскільки:

Sing Синтаксичний розбір опцій закінчиться з першої знайденої опції, а все подальше буде відкинуто.

⚠️ Тільки 26 параметрів як алфавіт.


Метод 3: Глобальна змінна Bash

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

Ці змінні можуть використовуватися іншими програмами, що працюють в одній оболонці.

Вони продуваються, коли оболонка закрита, але не тоді, коли програма php припиняється. Ми можемо встановити їх постійними в ~/.bashrc!


Метод 4: STDIN pipe і 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


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

а також можна використовувати безпосередньо

$$ ключ = $ val

використовуйте це так:

myFile.php / key = val

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.