수색…


인수 처리

인수는 대부분의 C 스타일 언어와 비슷한 방식으로 프로그램에 전달됩니다. $argc 는 프로그램 이름을 포함하는 인수의 개수를 포함하는 정수이고 $argv 는 프로그램에 대한 인수를 포함하는 배열입니다. $argv 의 첫 번째 요소는 프로그램의 이름입니다.

#!/usr/bin/php

printf("You called the program %s with %d arguments\n", $argv[0], $argc - 1);
unset($argv[0]);
foreach ($argv as $i => $arg) {
    printf("Argument %d is %s\n", $i, $arg);
}

php example.php foo bar (example.php가 위의 코드를 포함)로 위 응용 프로그램을 호출하면 다음과 같은 결과가 출력됩니다.

당신은 2 개의 인자를 가진 프로그램 example.php를 호출했습니다.
인수 1은 foo입니다.
인수 2는 바입니다.

$argc$argv 는 글로벌 변수가 아니라 슈퍼 글로벌 변수입니다. 함수에서 global 키워드를 사용하여 로컬 범위로 가져와야합니다.

이 예제는 "" 또는 \ 와 같은 이스케이프가 사용될 때 인수가 그룹화되는 방법을 보여줍니다.

예제 스크립트

var_dump($argc, $argv);

명령 줄

$ php argc.argv.php --this-is-an-option three\ words\ together or "in one quote"     but\ multiple\ spaces\ counted\ as\ one
int(6)
array(6) {
  [0]=>
  string(13) "argc.argv.php"
  [1]=>
  string(19) "--this-is-an-option"
  [2]=>
  string(20) "three words together"
  [3]=>
  string(2) "or"
  [4]=>
  string(12) "in one quote"
  [5]=>
  string(34) "but multiple spaces counted as one"
}

PHP 스크립트가 -r 사용하여 실행되는 경우 :

$ php -r 'var_dump($argv);'
array(1) {
  [0]=>
  string(1) "-"
}

또는 php STDIN으로 파이프 된 코드 :

$ echo '<?php var_dump($argv);' | php
array(1) {
  [0]=>
  string(1) "-"
}

입력 및 출력 처리

CLI에서 실행하면 상수 STDIN , STDOUTSTDERR 이 미리 정의됩니다. 이러한 상수는 파일 핸들이며 다음 명령을 실행 한 결과와 동등한 것으로 간주 될 수 있습니다.

STDIN = fopen("php://stdin", "r");
STDOUT = fopen("php://stdout", "w");
STDERR = fopen("php://stderr", "w");

상수는 표준 파일 핸들이있는 곳이라면 어디에서나 사용할 수 있습니다.

#!/usr/bin/php

while ($line = fgets(STDIN)) {
    $line = strtolower(trim($line));
    switch ($line) {
        case "bad":
            fprintf(STDERR, "%s is bad" . PHP_EOL, $line);
            break;
        case "quit":
            exit;
        default:
            fprintf(STDOUT, "%s is good" . PHP_EOL, $line);
            break;
    }
}

이전에 참조 된 내장 스트림 주소 (대부분 php://stdin , php://stdoutphp://stderr )는 대부분의 컨텍스트에서 파일 이름 대신 사용할 수 있습니다.

file_put_contents('php://stdout', 'This is stdout content');
file_put_contents('php://stderr', 'This is stderr content');

// Open handle and write multiple times.
$stdout = fopen('php://stdout', 'w');

fwrite($stdout, 'Hello world from stdout' . PHP_EOL);
fwrite($stdout, 'Hello again');

fclose($stdout);

대안으로 입력을 위해 readline () 을 사용할 수 있으며 출력을 위해 echo 또는 print 또는 다른 문자열 인쇄 함수를 사용할 수도 있습니다.

$name = readline("Please enter your name:");
print "Hello, {$name}.";

리턴 코드

exit 구조는 실행 환경에 리턴 코드를 전달하는 데 사용될 수 있습니다.

#!/usr/bin/php

if ($argv[1] === "bad") {
    exit(1);
} else {
    exit(0);
}

아무 것도 제공되지 않으면 기본적으로 종료 코드 0 이 반환됩니다. 즉 exitexit(0) . exit 가 함수가 아니기 때.에 리턴 코드가 전달되지 않으면} 호는 필요하지 않습니다.

리턴 코드는 0 - 254 범위에 있어야합니다 (255는 PHP에 의해 예약되어 있으므로 사용해서는 안됩니다). 관습 적으로 리턴 코드 0 종료하면 호출 프로그램에 PHP 스크립트가 성공적으로 실행되었다는 메시지가 표시됩니다. 0이 아닌 리턴 코드를 사용하여 호출 프로그램에 특정 오류 조건이 발생했음을 알리십시오.

프로그램 옵션 처리

프로그램 옵션은 getopt() 함수로 처리 할 수 ​​있습니다. POSIX getopt 명령과 유사한 구문으로 작동하며 GNU 스타일의 긴 옵션을 추가로 지원합니다.

#!/usr/bin/php

// a single colon indicates the option takes a value
// a double colon indicates the value may be omitted
$shortopts = "hf:v::d";
// GNU-style long options are not required
$longopts = ["help", "version"];
$opts = getopt($shortopts, $longopts);

// options without values are assigned a value of boolean false
// you must check their existence, not their truthiness
if (isset($opts["h"]) || isset($opts["help"])) {
    fprintf(STDERR, "Here is some help!\n");
    exit;
}

// long options are called with two hyphens: "--version"
if (isset($opts["version"])) {
    fprintf(STDERR, "%s Version 223.45" . PHP_EOL, $argv[0]);
    exit;
}

// options with values can be called like "-f foo", "-ffoo", or "-f=foo"
$file = "";
if (isset($opts["f"])) {
    $file = $opts["f"];
}
if (empty($file)) {
    fprintf(STDERR, "We wanted a file!" . PHP_EOL);
    exit(1);
}
fprintf(STDOUT, "File is %s" . PHP_EOL, $file);

// options with optional values must be called like "-v5" or "-v=5"
$verbosity = 0;
if (isset($opts["v"])) {
    $verbosity = ($opts["v"] === false) ? 1 : (int)$opts["v"];
}
fprintf(STDOUT, "Verbosity is %d" . PHP_EOL, $verbosity);

// options called multiple times are passed as an array
$debug = 0;
if (isset($opts["d"])) {
    $debug = is_array($opts["d"]) ? count($opts["d"]) : 1;
}
fprintf(STDOUT, "Debug is %d" . PHP_EOL, $debug);

// there is no automated way for getopt to handle unexpected options

이 스크립트는 다음과 같이 테스트 할 수 있습니다.

./test.php --help
./test.php --version
./test.php -f foo -ddd
./test.php -v -d -ffoo
./test.php -v5 -f=foo
./test.php -f foo -v 5 -d

-v 5 가 유효하지 않기 때문에 마지막 방법은 작동하지 않습니다.

참고 : PHP 5.3.0부터 getopt 는 OS 독립적이며 Windows에서도 작동합니다.

스크립트 실행을 명령 줄로 제한

함수 php_sapi_name() 과 상수 PHP_SAPI 모두 PHP에서 사용중인 인터페이스 유형 ( S erver API )을 반환합니다. 이 함수는 함수의 출력이 cli 같은지 여부를 확인하여 스크립트의 실행을 명령 줄로 제한하는 데 사용할 수 있습니다.

if (php_sapi_name() === 'cli') {
    echo "Executed from command line\n";
} else {
    echo "Executed from web browser\n";
}

drupal_is_cli() 함수는 스크립트가 명령 행에서 실행되었는지 여부를 감지하는 함수의 예입니다.

function drupal_is_cli() {
    return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}

스크립트 실행하기

Linux / UNIX 또는 Windows에서 스크립트는 PHP 실행 파일에 인수로 전달할 수 있으며 그 스크립트의 옵션과 인수는 다음과 같습니다.

php ~/example.php foo bar
c:\php\php.exe c:\example.php foo bar

그러면 foobar 가 인수로 example.php 전달됩니다.

Linux / UNIX에서 스크립트를 실행하는 가장 좋은 방법은 파일의 첫 번째 행에 shebang (예 : #!/usr/bin/env php )을 사용하고 파일의 실행 비트를 설정하는 것입니다. 스크립트가 경로 상에 있다고 가정하면 직접 호출 할 수 있습니다.

example.php foo bar

/usr/bin/env php 를 사용하면 PATH를 사용하여 PHP 실행 파일을 찾을 수 있습니다. PHP를 설치하는 방법,이 같은 장소에 위치하지 않을 수 있습니다 다음 (예 /usr/bin/php 또는 /usr/local/bin/php )과는 달리, env 에서 일반적으로 볼 수 /usr/bin/env .

Windows에서 PHP의 디렉토리와 스크립트를 PATH에 추가하고 PATHEXT를 편집하여 PATH를 사용하여 .php 를 감지 할 수 있습니다. 또 다른 방법은 PHP 스크립트와 동일한 디렉토리에 example.bat 또는 example.cmd 라는 파일을 추가하고이 행을 작성하는 것입니다.

c:\php\php.exe "%~dp0example.php" %*

또는 PHP 디렉토리를 PATH에 추가하면 편리하게 사용할 수 있습니다.

php "%~dp0example.php" %*

명령 줄에서의 동작 차이

CLI에서 실행할 때 PHP는 웹 서버에서 실행될 때와 다른 몇 가지 동작을 나타냅니다. 이러한 차이점을 염두에 두어야합니다. 특히 동일한 스크립트가 두 환경에서 실행될 수있는 경우에 특히 그렇습니다.

  • 디렉토리 변경 없음 웹 서버에서 스크립트를 실행할 때 현재 작업 디렉토리는 항상 스크립트 자체의 디렉토리입니다. 코드는 require("./stuff.inc"); 파일이 스크립트와 동일한 디렉토리에 있다고 가정합니다. 명령 줄에서 현재 작업 디렉토리는 스크립트를 호출 할 때 사용중인 디렉토리입니다. 명령 줄에서 호출 할 스크립트는 항상 절대 경로를 사용해야합니다. (마법 상수 __DIR____FILE__ 은 예상대로 계속 작동하고 스크립트의 위치를 ​​반환합니다.)
  • 출력 버퍼링 없음 php.ini 지시어 output_bufferingimplicit_flush 는 각각 falsetrue 기본 설정됩니다. 버퍼링은 계속 사용할 수 있지만 명시 적으로 활성화해야합니다. 그렇지 않으면 출력이 항상 실시간으로 표시됩니다.
  • 시간 제한 없음 php.ini 지시문 max_execution_time 은 0으로 설정되어 있으므로 스크립트는 기본적으로 시간 초과되지 않습니다.
  • HTML 오류 없음 php.ini 지시어 html_errors 활성화 한 경우 명령 행에서 무시됩니다.
  • 다른 php.ini 를로드 할 수 있습니다 . cli에서 php를 사용할 때 웹 서버와 다른 php.ini 사용할 수 있습니다. php --ini 를 실행하면 어떤 파일이 사용 중인지 알 수 있습니다.

내장 웹 서버 실행

5.4 버전부터 PHP는 서버가 내장되어 있습니다. nginx 나 apache와 같은 다른 http 서버를 설치할 필요없이 응용 프로그램을 실행하는 데 사용할 수 있습니다. 내장형 서버는 개발 및 테스트 목적으로 컨트롤러 환경에서만 설계되었습니다.

그것은 명령 php -S로 실행될 수 있습니다 :

그것을 테스트하기 위해 포함 된 index.php 파일을 만듭니다.

<?php
echo "Hello World from built-in PHP server";

명령어 php -S localhost:8080 실행합니다 php -S localhost:8080

이제 브라우저에서 콘텐츠를 볼 수 있어야합니다. 이를 확인하려면 http://localhost:8080 이동 http://localhost:8080

모든 액세스로 인해 로그 항목이 터미널에 기록되어야합니다.

[Mon Aug 15 18:20:19 2016] ::1:52455 [200]: /

getopt ()의 가장자리 경우

이 예는 사용자 입력이 드문 경우 getopt 의 동작을 보여줍니다.

getopt.php
var_dump(
    getopt("ab:c::", ["delta", "epsilon:", "zeta::"])
);
셸 명령 줄
$ php getopt.php -a -a -bbeta -b beta -cgamma --delta --epsilon --zeta --zeta=f  -c gamma
array(6) {
  ["a"]=>
  array(2) {
    [0]=>
    bool(false)
    [1]=>
    bool(false)
  }
  ["b"]=>
  array(2) {
    [0]=>
    string(4) "beta"
    [1]=>
    string(4) "beta"
  }
  ["c"]=>
  array(2) {
    [0]=>
    string(5) "gamma"
    [1]=>
    bool(false)
  }
  ["delta"]=>
  bool(false)
  ["epsilon"]=>
  string(6) "--zeta"
  ["zeta"]=>
  string(1) "f"
}

이 예에서 볼 수있는 것은 :

  • 사용 가능한 경우 개별 옵션 (콜론 없음)은 항상 부울 값 false 전달합니다.
  • 옵션을 반복하면 getopt 의 출력에있는 각 값이 배열이됩니다.
  • 필수 인수 옵션 (콜론 한 개)은 공백 하나를 허용하거나 (옵션 인수 옵션과 같은) 공백을 구분 기호로 사용합니다.
  • 어떤 옵션에 매핑 될 수없는 하나의 인수 뒤에는 뒤에있는 옵션도 매핑되지 않습니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow