명령 줄에서 실행되는 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);
앞에 추가 ?>
하면 배열 $b
에 type => 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.
참고URL : https://stackoverflow.com/questions/6826718/pass-variable-to-php-script-running-from-command-line
'Programing' 카테고리의 다른 글
React Native 절대 위치 수평 중심 (0) | 2020.10.31 |
---|---|
CLLocationManager없이 MKMapView를 사용자의 현재 위치로 확대하려면 어떻게합니까? (0) | 2020.10.31 |
"리터럴"이란 단어는 무엇을 의미합니까? (0) | 2020.10.31 |
C #에서 "사용"블록은 언제 사용해야합니까? (0) | 2020.10.31 |
Sublime Text 2 : 자바 스크립트 들여 쓰기 자동 수정? (0) | 2020.10.31 |