itsource

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

mycopycode 2022. 11. 26. 14:01
반응형

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

명령줄에서 (crontab을 통해) 실행해야 하는 PHP 파일이 있습니다.통과해야 해type=daily는는시시시시다다

php myfile.php?type=daily

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

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

내가 뭘 할 수 있을까?

?type=daily인수(인수)로)$_GETarray 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를 .$argvmanager.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.phpphp 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 ?>가 「」, 「」라고 표시됩니다.$btype => 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()동일하게 동작할 수 있습니다.


Bash-Scripting 가이드

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

반응형