명령줄에서 실행 중인 PHP 스크립트에 변수 전달
명령줄에서 (crontab을 통해) 실행해야 하는 PHP 파일이 있습니다.통과해야 해type=daily
건는는시시시시다다
php myfile.php?type=daily
그러나 다음 오류가 반환되었습니다.
입력 파일을 열 수 없습니다: myfile.filename?type=daily
내가 뭘 할 수 있을까?
?type=daily
인수(인수)로)$_GET
array pagesarray)에 합니다.
php myfile.php daily
그 불러옵니다.$argv
「 」( 「 」)가 .$argv[1]
부터, syslog$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
manager.manager로 하다
php myfile.php daily
제 파일에 있어요.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 인수를 받아들입니다.
자세한 내용은 parse_str을 참조하십시오.
「」와 같이, 보다 하고 싶은 .php myfile.php type=daily foo=bar
를 '어소시에이션 배열'과 할 수 .$_GET
-array: - :
// Convert $argv into associative array
function parse_argv(array $argv): array
{
$request = [];
foreach ($argv as $i => $a) {
if (!$i) {
continue;
}
if (preg_match('/^-*(.+?)=(.+)$/', $a, $matches)) {
$request[$matches[1]] = $matches[2];
} else {
$request[$a] = true;
}
}
return $request;
}
if (!empty($argv[1])) {
$_GET = parse_argv($argv);
}
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);
before ?>
가 「」, 「」라고 표시됩니다.$b
type => daily
.
다음 코드를 사용하여 명령줄과 웹 브라우저를 모두 사용할 수 있습니다.이 코드를 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;
}
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')
.
getopt 사용을 강력히 권장합니다.
옵션을 인쇄하려면 Get Option Kit를 참조하십시오.
다음과 같이 매개 변수로 전달합니다.
php test.php one two three
그리고 내부 파일 테스트.php:
<?php
if(isset($argv))
{
foreach ($argv as $arg)
{
echo $arg;
echo "\r\n";
}
}
?>
네 가지 주요 대안이 있습니다.둘 다 별난 점이 있지만, 내가 보기에 방법 4는 많은 장점이 있다.
./script
로 시작하는 셸 스크립트입니다.#!/usr/bin/php
방법 1: $140v
./script hello wo8844rld
// $argv[0] = "script", $argv[1] = "hello", $argv[2] = "wo8844rld"
⚠420v를 사용하면 파라미터 순서가 중요합니다.
방법 2:. getopt()
./script -p7 -e3
// getopt("p::")["p"] = "7", getopt("e::")["e"] = "3"
와 병용하는 것은 어렵다$argv
이유:
⚠options(옵션 구문 분석)은 옵션이 처음 발견된 시점에서 종료되며, 이후 모든 항목은 삭제됩니다.
⚠알파벳으로 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 "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)) ...
STDIN을 읽으면 fread() 또는 fgets()와 동일하게 동작할 수 있습니다.
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;
또한 다음과 같이 직접 사용할 수 있습니다.
$$key = $val
다음과 같이 사용합니다.
myFile.php /key=val
이 바닐라/가든클리를 기써브에서 찾았어요.PHP CLI에 대한 모든 요구에 부응한다고 생각합니다.
파일 전달의 복잡성을 피하기 위해 sed를 사용하여 php 파일에 직접 행을 삽입할 수 있습니다.
sed -i "i (백슬래시)type=daily myfile.php
or as I use it with variables:
sed - i "i (백슬래시) $type = (백슬래시)"${daily}(백슬래시), ${path}"/myfile.dlash"
언급URL : https://stackoverflow.com/questions/6826718/pass-a-variable-to-a-php-script-running-from-the-command-line
'itsource' 카테고리의 다른 글
JSP : JSTL 태그 (0) | 2022.11.26 |
---|---|
Java: 정수는 vs.== (0) | 2022.11.26 |
다양한 데이터 구조의 시간 복잡도는 어느 정도입니까? (0) | 2022.11.26 |
Python에서 임시 디렉토리를 가져오는 크로스 플랫폼 방법 (0) | 2022.11.26 |
Java 값을 사용하여 날짜 개체를 만드는 방법 (0) | 2022.11.26 |