개발 꿀팁/PHP

php CLI 프로그래밍 명령줄 모드 관련 지식 포인트

Jammie 2022. 9. 26. 17:13
반응형

명령 줄에서 php 스크립트를 실행합니다. 일반적으로 다음을 수행할 수 있습니다.

1.demo1.php

<?php
echo "hello php\n";

그 다음 스크립트를 실행합니다

php demo1.php

실행 결과:

2, demo2.php, 실행

which php

php 스크립트 명령이 어디에 있는지 확인합니다. 예를 들어, /usr/local/php/bin/php입니다. 그러면 demo2.php를 이렇게 쓸 수 있습니다

#!/usr/local/php/bin/php
<?php
echo "hello php\n";

그런 다음 chmod + x demo2.php를 실행하고 demo2.php를 실행 파일로 설정하면 우리가 셸을 쓰는 것과 같은 방식으로 스크립트를 실행하면 접두사 php 없이 ./demo2.php로 바로 실행할 수 있습니다

./demo2.php

두 가지 방법 모두 가능하며 일반적으로 작성된 php 스크립트는 crontab 시간 지정 작업에 사용되며 두 번째 방법으로 작성하는 것이 좋습니다.

이제 관련 지식 포인트를 소개하겠습니다.

1, CLI 프로그래밍, 명령줄 모드에서 쿠키, 세션은 모두 쓸모없으므로 사용하지 마십시오.이러한 내장된 초글로벌 변수를 사용합니다.session_start도 헛수고이고, session 파일이 생성되고, 다음에 실행할 때 또 하나의 파일이 생성되어 성능 낭비는 물론 session 파일이 공간을 차지합니다.다음은 반대의 예를 하나 들겠습니다, 명심하십시오, 이렇게 사용하지 마십시오

<?php
session_save_path(__DIR__);
session_start();

php demo3.php를 두 번 실행한 다음 ll에서 파일 목록을 보면 쓸모없는 session 파일이 두 개 더 나옵니다

2. set_time_limit이 유효하지 않습니다. 명령줄 모드 자체는 타임아웃 메커니즘이 없으므로 이렇게 쓸 필요가 없습니다.

3. PHP 버전 판단, PHP_VERSION 상수, version_compare 함수, 가능CLI에서만 사용할 수 없는 호환성 처리를 쉽게 할 수 있습니다.

php7.1.0은 pcntl_async_signa라는 새로운 함수를 제공합니다.ls는 pcntl_signal_dispatch를 대체하는 데 사용되며 낮은 버전의 php와 호환하기 위해 여러 버전과 호환되도록 이렇게 쓸 수 있습니다

#!/usr/local/php/bin/php
<?php
 
if(version_compare(PHP_VERSION, '7.1.0')>=0){
    pcntl_async_signals(true);
}
 
pcntl_signal(SIGINT, function(){
   echo "신호 트리거\n";
});
 
 
$i=0;
while(true){
    if(version_compare(PHP_VERSION, '7.1.0')<0){
        pcntl_signal_dispatch();
    }
    $i++;
    echo $i,"\n";
    sleep(1);    
}

4, 프로세스 이름 cli_set_process_title, setproctitle을 설정하여 php 스크립트를 실행할 때, 우리는 아래의 코드를 이용하여 우리의 프로세스 이름을 설정할 수 있습니다. 예를 들어 장기간 실행되는 스크립트는 한 번에 하나만 실행할 수 있으며 반복할 수 없습니다. 프로그램의 이름을 설정할 수 있습니다. 실행할 때 현재 프로세스가 실행 중인 프로세스 이름이 있는지 조회하면 반복 여부를 판단할 수 있습니다

<?php
 
$pid = trim(`pidof learnPHPcli`);
if (!empty($pid)) {
    exit('sorry');
}
 
function set_process_title($title)
{
    set_error_handler(function () {});
    // >=php 5.5
    if (function_exists('cli_set_process_title')) {
        cli_set_process_title($title);
    } // Need proctitle when php<=5.5 .
    elseif (extension_loaded('proctitle') && function_exists('setproctitle')) {
        setproctitle($title);
    }
    restore_error_handler();
}
 
set_process_title("learnPHPcli");
 
//자신의 업무를 수행하기 위해 위의 코드가 중복되지 않도록 합니다。
echo "run";
sleep(10);

5. php_sapi_name 함수 실행 모드 체크, CLI 실행 여부 판단, 스크립트의 남용을 방지하기 위해 CLI 코드는 php-fpm 모드에서 실행해서는 안 된다.

<?php
// 물론 PHP_SAPI로 판단할 수도 있지만
if (php_sapi_name() != "cli") {
   exit("only run in cli \n");
}

6. 현재 시스템이 당신의 코드 요구 사항을 충족하는지 판단합니다. Linux에서만 실행할 수 있는 경우 상수 PHP_OS 또는 DIRECTORY_SEPARATOR를 사용할 수 있습니다

<?php
if (DIRECTORY_SEPARATOR === '\\') {
    exit('only run Unix-like');
}

7, register_argc_argv 설정이 true로 설정되어 있으므로 $argv $argc 변수를 사용하여 외부에서 제출된 매개변수의 수와 값을 얻을 수 있습니다

<?php
function test(){
  global $argc,$argv;
  echo $argc."\n";
  print_r($argv);
}
 
test();

명령 실행:

php demo4.php hehe haha

결과는 다음과 같습니다

8. 물론 getopt도 인수를 얻기 위해 사용할 수 있습니다. -a-h 명령행 인수를 얻을 수 있습니다

<?php
 
$options="a:";
$longopts=["help:"];
 
$result= getopt($options,$longopts);
 
var_dump($result);

실행할 때, 매개변수를 사용할 수 있습니다

php demo5.php -a test --help long

결과는 다음과 같습니다

9. CLI 모드에서 php는 우리에게 세 가지 상수를 정의해 줍니다: STDIN, STDOUT, STDERR은 표준 입력, 표준 출력, 표준 오류에 사용됩니다. 우리가 인쇄하면 사실 세 가지 리소스 핸들입니다

<?php
var_dump(STDIN,STDOUT,STDERR);

STDIN을 사용하여 클라이언트의 입력을 받을 수 있습니다.

<?php
$res1= trim(fgets(STDIN));
$res2= trim(fgets(STDIN));
echo $res1,$res2,"\n";

실행:

php demo7.php

그런 다음 두 개의 값을 입력하여 줄바꿈으로 구분할 수 있습니다

STDOUT와 STDERR을 사용하여 표준 출력과 표준 오류를 출력합니다

<?php

fwrite(라이트)STDOUT, "표준 출력 \n";
fwrite(라이트)STDERR, "표준 오류\n";

 

표준 출력과 표준 오류는 모두 단말기로 출력되므로, 우리는 리다이렉트를 사용하여, 그들을 다른 곳으로 리다이렉트할 수 있다

php demo8.php 1>>out 2>>err

예를 들어 위의 예는 표준 출력을 파일 out으로 리디렉션하고 표준 오류를 파일 err로 리디렉션하는 것입니다.

10. php-m | grep "name" 을 사용할 수 있는 확장 모듈이 있는지 확인합니다.도리

php -m|grep pcntl

 

11. php의 구성 파일을 보려면 php --ini를 사용하여 찾을 수 있습니다

내 환경 설정 파일을 볼 수 있습니다.

/usr/local/php/etc/php-cli.ini

php의 구성 목록에서, 우리는 설정할 수 있습니다.php.ini 파일 두 개, 하나는 php.ini, 하나는 php-CLI.ini는 웹의 php-fpm에 해당하는 구성이고, 하나는 CLI 모드에 해당하는 구성으로 두 가지를 구별하며, 웹 모드에서 php.ini는 그다지 필요하지 않고 보안 문제를 일으킬 수 있는 일부 함수 또는 클래스를 비활성화하도록 구성할 수 있습니다

 

반응형