Programing

명령 줄에서 실행되는 PHP 스크립트에 변수 전달

lottogame 2020. 10. 31. 09:13
반응형

명령 줄에서 실행되는 PHP 스크립트에 변수 전달


crontab을 통해 명령 줄에서 실행하는 데 필요한 PHP 파일이 있습니다. type=daily파일 로 전달해야하는데 방법을 모르겠습니다. 나는 시도했다 :

php myfile.php?type=daily

그러나 다음 오류가 반환되었습니다.

입력 파일을 열 수 없습니다 : myfile.php? type = daily

어떡해?


?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실제로 충분한 변수가 포함되어 있는지 확인해야하거나 확인해야합니다. )


일반 매개 변수로 전달하고 $argv배열을 사용하여 PHP에서 액세스하십시오 .

php myfile.php daily

그리고 myfile.php

$type = $argv[1];

이 줄은 CLI 호출의 인수를 php myfile.php "type=daily&foo=bar"잘 알려진 $_GET배열 로 변환합니다 .

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

전역 $_GET배열 을 덮어 쓰는 것은 다소 지저분하지만 모든 스크립트를 신속하게 변환하여 CLI 인수를 허용합니다.

자세한 내용은 http://php.net/manual/en/function.parse-str.php 를 참조하십시오.


getopt () 함수를 사용하면 명령 줄에서 매개 변수를 읽을 수도 있습니다. PHP 실행 명령으로 값을 전달하면됩니다.

php abc.php --name = xyz

abc.php

$val = getopt(null, ["name:"]);
print_r($val); // output: ['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);앞에 추가 ?>하면 배열 $btype => daily.


getopt 사용을 강력히 권장합니다.

http://php.net/manual/en/function.getopt.php의 문서

https://github.com/c9s/GetOptionKit#general-command-interface참조 하는 것보다 옵션에 대한 도움말을 인쇄 하려면


php.net에서 sep16이 권장하는 것을 사용할있습니다 .

<?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 코드 위에 넣으십시오. 각 명령 줄 매개 변수에 대해 $ _GET 변수를 생성합니다.

In your code you only need to check for $_GET variables then, not worrying about if script is called from webbrowser or command line.

if(isset($argv))
    foreach ($argv as $arg) {
        $e=explode("=",$arg);
        if(count($e)==2)
            $_GET[$e[0]]=$e[1];
        else    
            $_GET[$e[0]]=0;
    }

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

This code should not be used. First of all CLI called like: /usr/bin/php phpscript.php will have one argv value which is name of script

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

This one will always execute since will have 1 or 2 args passe


Just pass it as parameters as follows:

php test.php one two three

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

I put parameters in $_REQUEST

$_REQUEST[$key] = $val;

and also usable directly

$$key=$val

use this like that:

myFile.php /key=val


There is 4 main alternatives, both have their quirks, Method 4 has many advantages from my view.


./script is a shell script starting by #!/usr/bin/php


Method 1: $argv

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

⚠️ Using $argv, the params order is critical.


Method 2: getopt()

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

It's hard to use in conjunction of $argv, because:

⚠️ The parsing of options will end at the first non-option found, anything that follows is discarded.

⚠️ Only 26 params as the alphabet.


Method 3: Bash Global variable

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

Those variables can be used by other programs running in the same shell.

They are blown when the shell is closed, but not when the php program is terminated. We can set them permanent in ~/.bashrc!


Method 4: STDIN pipe and stream_get_contents()

Some piping examples:


./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)) ...

We can pass very long strings, arrays, json's, a config file containing lines of parameters, this is powerful.

It might works similary with fread() or fgets(), by reading the STDIN.


Bash-Scripting Guide

참고URL : https://stackoverflow.com/questions/6826718/pass-variable-to-php-script-running-from-command-line

반응형