PHP를 쉘에서 실행 시킬때(CLI 환경) restart 시키는 방법 > PHP
PHP

PHP를 쉘에서 실행 시킬때(CLI 환경) restart 시키는 방법

조회 51회 댓글 0건

PHP를 웹서버를 통해서 실행 시키는 것을 흔히 사용하지만

쉘에서 실행 시키는 경우도 있습니다. 통상 CLI 환경이라고 합니다.


아래는 웹브라우저에 출력을 내보는것이 아니라 쉘에서 실행 시키는 경우 스케줄에 등록하여 매일 재시작 해야 되는 경우 필요한것입니다.

현재 실행 중인 프로그램을 강제 종료하고 스케줄에 의해 다시 실행시크는 형태의 프로그램을 만들어야 할 경우 유용 합니다.


  /**
   *
   * Linux 쉘에서 백그라운드 실행 시킬때 PID 관리를 위한것
   *
   */
  class PhpRestart
  {
    private $HOST_NAME  = '';
    private $TYPE       = 'restart';
    private $STATUS     = '';
    private $_PID_      = 0;
    private $FILE_PID   = '';

    function __construct( string $TYPE='' )
    {
      if ( strlen($TYPE) < 1 ) $TYPE = 'start';
      $this->_PID_      = getmypid();
      $this->TYPE       = $TYPE;
      $this->HOST_NAME  = php_uname('n');
      $this->FILE_PID   =  __DIR__ . '/testphp_' . $this->_PID_ . '.pid';

      if ( $TYPE == 'start' ) {
        $this->start();
      }
      else if ( $TYPE == 'stop' ) {
        $this->stop();
      }
      else if ( $TYPE == 'restart' ) {
        $this->restart();
      }
    }

    /**
     * 파일이 있으면 kill 처리 후 pid 파일을 생성 한다.
     *
     * @return [type]
     *
     */
    private function start() {
      if ( is_file($this->FILE_PID) ) $this->kill();

      $wrtSize  = file_put_contents($this->FILE_PID, $this->_PID_);
      echo date('Y-m-d H:i:s ') . "PID 생성: $this->_PID_" . ' / pidFile: ' . $this->FILE_PID . PHP_EOL;
      return $wrtSize;
    }

    private function restart() {
      $rUnlink  = $this->kill();
      $wrtSize  = $this->start();

      echo date('Y-m-d H:i:s ') . "STATUS: $this->STATUS -> $this->_PID_ / $wrtSize:$this->FILE_PID / HOST_NAME:$this->HOST_NAME \n";

      return $wrtSize;
    }

    private function stop() {
      $rUnlink  = $this->kill();

      echo date('Y-m-d H:i:s ') . "unlink: $rUnlink / 프로그램을 종료 합니다. \n";
      exit;
    }

    private function kill()
    {
      if ( is_file($this->FILE_PID) )
      {
        $pid_no   = file_get_contents($this->FILE_PID);
        $rExec    = shell_exec("/bin/kill $pid_no");
        $rUnlink  = unlink($this->FILE_PID);

        echo date('Y-m-d H:i:s ') . "STATUS: $this->STATUS -> $rExec / $rUnlink: $this->FILE_PID \n";
        return $rUnlink;
      }
      else {
        echo date('Y-m-d H:i:s ') . "$this->FILE_PID 파일이 없습니다. " . PHP_EOL;
        return false;
      }
    }

    public function get_pid() {
      return $this->_PID_;
    }

    public function get_status() {
      return $this->STATUS;
    }

    public function get_pidfile() {
      return $this->FILE_PID;
    }
  }

  $oPhpExec   = new PhpRestart( 'restart' );
  echo date('Y-m-d H:i:s ') . '생성된 pid 값은: ' . $oPhpExec->get_pid() . '입니다.' . PHP_EOL;
 


* 클래스가 복잡해 보인다면 간단한 아래를 참고

  - 쉘에서 실행할때 프로세스(pid) 저장후 재시작(restart) 할때 kill(종료) 시키기 > PHP 


* 클래스 만들때 :: 두개 찍어서 직접 메소드 호출하고 자 할때는 아래를 참고하세요.

  중요한것은 퍼블릭 이어야 합니다.

  - 모던php 사용시 흔하게 볼 수 있는 한가지 static > PHP 



  class Parent2 {
    function getNew() : string {
      return 'parent - getNew print: ' . __METHOD__ . PHP_EOL;
    }
  }
  class Child extends Parent2
  {
    static $ymd2 = ''; //

    public static function setYmd( string $ymd='' ) {
      if (strtotime($ymd) < 1) {
        $ymd      = date('Y-m-d H:i:s');
      }
      self::$ymd2    = $ymd;
    }

    public function getYmd() {
      return self::$ymd2;
    }

    public function get_parent_new() {
      return parent::getNew();
    }
  }

  echo date('Y-m-d H:i:s ') . '설정:  ' . Child::setYmd( 'testYmd' ) . PHP_EOL;
  echo date('Y-m-d H:i:s ') . '출력1: ' . Child::getYmd() . PHP_EOL;
  echo date('Y-m-d H:i:s ') . '출력2: ' . Child::get_parent_new() . PHP_EOL;
 


범위확인 연산자에 - 더블콜론에 대해선 메뉴얼을 보시는것이 좋습니다.

PHP : 스코프 해석 연산자 (::) - 수동


아래는 맨위에 있는것을 더블콜론으로 만들어 보았습니다. static가 아니면 접근이 되도 VSCODE에선 파란색줄이 보입니다.

접근과 별도의 객체 생성이 아닌 직접접근을 하려면 어딘가에 있어야 하니 가져올 수 있는 권한이 있어야 한 다는것을 생각하면 됩니다.


  /**
   *
   * Linux 쉘에서 백그라운드 실행 시킬때 PID 관리를 위한것
   *
   */
  class PhpRestart
  {
    static $HOST_NAME  = '';
    static $TYPE       = 'restart';
    static $_PID_      = 0;
    static $FILE_PID   = '';

    public static function set_config( string $TYPE='' )
    {
      if ( strlen($TYPE) < 1 ) $TYPE = 'start';
      self::$_PID_      = getmypid();
      self::$TYPE       = $TYPE;
      self::$HOST_NAME  = php_uname('n');
      self::$FILE_PID   =  __DIR__ . '/testphp_' . self::$_PID_ . '.pid';
    }

    /**
     * 파일이 있으면 kill 처리 후 pid 파일을 생성 한다.
     *
     * @return [type]
     *
     */
    static function start() {
      if ( is_file(self::$FILE_PID) ) self::kill();

      $wrtSize  = file_put_contents(self::$FILE_PID, self::$_PID_);
      echo date('Y-m-d H:i:s ') . self::$TYPE . " PID 생성: " . self::$_PID_ .  ' / pidFile: ' . self::$FILE_PID . PHP_EOL;
      return $wrtSize;
    }

    static function restart() {
      $rUnlink  = self::kill();
      $wrtSize  = self::start();

      echo date('Y-m-d H:i:s ') . self::$TYPE . " PID: " . self::$_PID_ . " / $wrtSize:" . self::$FILE_PID . " / HOST_NAME:" . self::$HOST_NAME . PHP_EOL;;

      return $wrtSize;
    }

    static function stop() {
      $rUnlink  = self::kill();

      echo date('Y-m-d H:i:s ') . self::$TYPE .  " unlink: $rUnlink / 프로그램을 종료 합니다. \n";
      exit;
    }

    static function kill()
    {
      if ( is_file(self::$FILE_PID) )
      {
        $pid_no   = file_get_contents(self::$FILE_PID);
        $rExec    = shell_exec("/bin/kill $pid_no");
        $rUnlink  = unlink(self::$FILE_PID);

        echo date('Y-m-d H:i:s ') . self::$TYPE . " rExec: $rExec / $rUnlink: " . self::$FILE_PID . PHP_EOL;
        return $rUnlink;
      }
      else {
        echo date('Y-m-d H:i:s ') . self::$TYPE . " FILE_PID: " . self::$FILE_PID . " 파일이 없습니다. " . PHP_EOL;
        return false;
      }
    }

    public function get_pid() {
      return self::$_PID_;
    }

    public function get_pidfile() {
      return self::$FILE_PID;
    }
  }

  // 실행방법 1
  PhpRestart::set_config('start');
  PhpRestart::start();
  echo date('Y-m-d H:i:s ') . PhpRestart::$TYPE . ' 생성된 pid 값은: ' . PhpRestart::get_pid() . '입니다.' . PHP_EOL;

  // 실행방법 2
  $oPhpExec   = new PhpRestart();
  $oPhpExec->set_config('start');
  $oPhpExec->start();
  echo date('Y-m-d H:i:s ') . $oPhpExec->TYPE . ' 생성된 pid 값은: ' . $oPhpExec->get_pid() . '입니다.' . PHP_EOL;
 





  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
전체 161건 1 페이지
  • profile_image 프로그램을 변경 했는데 오류가 발생하고 잘못 되었다고 메시지가 나와 30분 가량 고생 했는데 원인은 갱신된것이 반영이 되지 않아서 였습니다.이런 경우에 문제가 될 수 있는것중 하나가 캐쉬 인데 우선 설정값으로 봤을 때는 몇 초면 해결이 되어야 하지만 그렇지 않기 때문에 다른 원이 있을 수 있습니다.하지만 확인해볼 수 있는것중 하나이기 때문에 PHP의 캐쉬를 사용하지 않아 보고 경과를 보는것도 방법이 될 수 있습니다.다음은 FTP를 이용하게 되면…
  • profile_image PHP 내장 클래스를 이용해서 간단한 방식으로 타임존의 시간을 변경하는 함수 입니다.아래 예는 UTC에서 KST(대한민국) 으로 변경하는데 9시간 차이나는 것을 확인 하면 됩니다.아래는 각 국가별 타임존 변경시 필요한 정보 입니다.List of Supported Timezones https://www.php.net/manual/en/timezones.php   /**   * 타임존 변경   *    * @param string $time  …
  • profile_image 이중콜론은 상수와 static 변수인 경우 사용이 가능 하다 . 아래 예제를 보면 이중콜론(더블콜론) 사용에 대한 이해가 쉽습니다.단 주의할것은 이중콜론 보다는 $this 부분에서 어디서 사용 하느냐에 따라 달라지는 경우가 있습니다. class ParentClass {  const T1 = '상수 - parent' . PHP_EOL;  function test() {    // 현재 이것을 의미하기 때문에 현재 객체가 된다.    // 하위에서…
  • profile_image 내장함수인 is_readable 함수는 파일이 있는지 그리고 읽을 수 있는 권한이 있는지 까지 체크를 해주는 함수인데 URL 체크기능은 없어 만들어진 클래스 입니다.USER_AGENT는 자주 변경 될 수 있어 외부의 글로벌 변수가 있으면 그것을 사용 합니다.그리고 ssl 인증서 무시할것인지. 네트워크를 통한 접속의 시간을 제한페이지가 이동 되었을때 자동으로 찾아서 이동 할것인 선택하는 옵션이 있습니다.  class PabburiUtil   { …
  • profile_image private는 현재 자신의 클래스에서만 사용이 가능하다. 상속이 안된다. 하위클래스에서 사용하고 싶으면 중간 클래스에서 받아서 그 하위에서 사용 할 수 있게 전달해 주면 된다. 상속시 변수, 상수를 하위 클래스에서 사용해야 된다면 public 또는 protected 를 사용하면 된다. 클래스 상속시 변수,상수 사용 PHP에서는 상속 체인을 따라 부모의 부모, 그리고 그 이상의 상위 클래스에 정의된 변수에 직접 접근하는 방법은 제공하지…
  • profile_image 프로그램을 하다보면 현재 디렉토리의 위치나 현재 실행되고 있는 함수나 클래스명을 알고 싶을때가 있는데 아래는 클래스명을 알 수 있는 2가지 방법에 대한 것입니다.   현재의 클래스명 가져오는 방법 현재 클래스의 이름을 가져오려면 get_class() 함수 또는 CLASS 매직 상수를 사용할 수 있습니다.   get_class() 함수 이 함수는 인스턴스가 주어지면 해당 인스턴스의 클래스 이름을 반환합니다. 인자 없이 호출하면 현재 객체의 클래…
  • profile_image 배열의 데이터를 기준으로 각각 오름차순, 내림차순 처리를 할 수 있는 함수 입니다.샘플 데이터에선 이름, 나이, 몸무계로 확인이 가능 합니다.  /**   * sort_data   *   * @param array $data   * @param bool $nameAscending   * @param bool $ageAscending   * @param bool $weightAscending   *   * @return array   *   */…