PHP
명령 행 인터페이스 (CLI)
수색…
인수 처리
인수는 대부분의 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 , STDOUT 및 STDERR 이 미리 정의됩니다. 이러한 상수는 파일 핸들이며 다음 명령을 실행 한 결과와 동등한 것으로 간주 될 수 있습니다.
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://stdout
및 php://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
이 반환됩니다. 즉 exit
는 exit(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
그러면 foo
와 bar
가 인수로 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_buffering
과implicit_flush
는 각각false
와true
기본 설정됩니다. 버퍼링은 계속 사용할 수 있지만 명시 적으로 활성화해야합니다. 그렇지 않으면 출력이 항상 실시간으로 표시됩니다. - 시간 제한 없음
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
의 출력에있는 각 값이 배열이됩니다. - 필수 인수 옵션 (콜론 한 개)은 공백 하나를 허용하거나 (옵션 인수 옵션과 같은) 공백을 구분 기호로 사용합니다.
- 어떤 옵션에 매핑 될 수없는 하나의 인수 뒤에는 뒤에있는 옵션도 매핑되지 않습니다.