Cake PHP4의 Constore/Command를 사용한 배치

10145 단어 CakePHP4

인도하다


랜서스는 현재 CakePHP2→CakePHP4로 버전 업그레이드를 진행 중이다.
CakePHP1.3→2 버전 업그레이드와 비교하여 간단한 절차에 따라 변환할 수 없습니다.
CakePHP→3or 4 버전으로 업그레이드하면 변경이 많아 재제작 작업시간과 거의 같다.
다시 만들려면 이 타이밍에 지금까지의 부채를 해결하고 대량과 관리 화면을 다른 창고로 분리해 재건 중이다.
https://speakerdeck.com/ykanazawa/ransazufalse-cakephp4yi-xing-nituite?slide=9

또 이 과정에서 CakePHP4 이후의 기술 노하우를 저장해 이후 랜서스 호스트의 CakePHP4 이전에도 적용한다.

셸에서 Comnsole/Command로 이동


CakePHP2가 현재 운용 중인 셸 레벨은 CakePHP5에서 폐지됩니다.
따라서 CakePHP4가 일괄 처리를 다시 하는 과정에서 Constore/Command로 옮겨졌다.
CakePHP4.x: 콘솔 명령
https://book.cakephp.org/4/ja/console-and-shells/commands.html

다중 부팅 방지 방법


CakePHP2에서 운용 중인 로트는 대부분 크론에서 정기적으로 수행되기 때문에 다중가동 방지 처리를 독자적으로 시행했다.
다중 가동 방지 처리에는 주로 다음과 같은 방법이 있다.
  • 잠금 파일 생성
  • ps명령 등을 통해 동일한 명칭의 처리가 있는지 확인
  • 잠긴 파일에 프로세스 번호 쓰기
  • CakePHP2에서 활용되는 일괄 설치는 주로 1가지 방법이다.
    그러나 일괄 처리 이상이 끝난 후 떨어지면 잠금 파일이 남아서 수동으로 삭제하지 않으면 시작할 수 없습니다.
    2가지 방법으로 시행되는 부분도 있지만, 비슷한 이름의 과정이 있으면 잘못된 판정이 많아 좋은 방법은 아닌 것 같다.
    3은 많은 서버 중간부품이 사용하는 방법이다.
    에 작성된 프로세스 번호가 일치하면 시작하지 않습니다.
    일치하지 않으면 프로세스 번호를 덮어쓰고 시작합니다.
    새로운 차례는 세 가지 방법을 채택하기로 결정했다.

    공공 클래스에서 다중 시작 처리를 실현하다


    다음은 다중 방지 처리의 설치입니다.
    BaseCommand 클래스가 생성되어 모든 로트 클래스를 상속할 수 있습니다.
    <?php
    declare(strict_types=1);
    
    namespace App\Command;
    
    use Cake\Console\Command;
    use ReflectionClass;
    
    class BaseCommand extends Command
    {
        protected $className;
        protected $lockFileName;
        protected $isLockfileExit = false;
    
        public function __construct()
        {
            parent::__construct();
    
            $this->className = (new ReflectionClass($this))->getShortName();
            $this->lockFileName = TMP . $this->className . '.lock';
    
            // ロックファイルのプロセスIDをチェック
            if ($this->checkLockFile()) {
                $this->isLockfileExit = true;
                exit;
            }
    
            // ロックファイルの作成
            file_put_contents($this->lockFileName, getmypid());
        }
    
        public function __destruct()
        {
            // プロセスがすでに存在して強制終了でなければ
            if (!$this->isLockfileExit) {
                // ロックファイルの削除
                unlink($this->lockFileName);
            }
        }
        /*
         * ロックファイルのプロセスIDをチェック
         */
        protected function checkLockFile(): bool
        {
            // ロックファイルの存在確認
            if (!file_exists($this->lockFileName)) {
                return false;
            }
            // ファイル内に記載されているプロセスIDを取得
            $pid = file_get_contents($this->lockFileName);
            $pid = str_replace(PHP_EOL, '', $pid);
            if (!is_numeric($pid)) {
                return false;
            }
    
            //取得したプロセスIDが動いていないかチェック
            $output = [];
            $cmd = "ps h " . $pid;
            exec($cmd, $output);
            if (isset($output[0])) {
                echo "Process already exists.\n";
                echo $output[0] . "\n";
                return true;
            }
            return false;
        }
    }
    

    일괄 처리 실행 시 메모리 소모 정보


    이전 전 Cake PHP 2차례, 원래는 Cake PHP 1이었다.많은 것이 3시대에 이루어졌다.
    CakePHP1.3의 경우 많은 시간이 걸리면 메모리 유출성 사용량이 지속적으로 증가하여 결국 대량은 감소한다.
    이른바 모델 캐시로 PHP-FPM 등 애플리케이션 서버(정기 교체 프로그램)는 대부분 큰 문제가 생기지 않지만, 많은 시간이 걸리는 양산으로 이를 표면화할 수 있기 때문이다.
    ※ 2010년께까지도 같은 사건에 대해 레일즈와 젠드프레임워크가 고민을 한 적이 있어 당시 프레임이 공통된 문제일 수 있습니다.
    따라서 오랜 시간이 소요되는 일괄 처리 중, 예를 들어 모든 사용자 ID에 따라 처리를 나누고, 여러 번 시작해서 대응한다.
    ※ 모델에서find 함수를 호출할 때 발생하기 때문에 일반 PHP를 사용하여 PDO에서 SQL을 직접 실행하는 것도 피할 수 있습니다.
    CakePHP4가 재제작된 로트에서 부팅이 확인되면 메모리 소비는 어느 정도 증가하지만 어느 정도 이상 증가하지는 않는다.
    다음은 새로 도착한 작업 메일의 대량 메모리 사용량의 변화입니다.
    양산을 시작할 때는 약 18MB를 소비했다가 이후 꾸준히 증가했으나 26MB 정도에서 안정됐다.
    $ bin/cake NewWorkEmail
    送信数:22 メモリ使用量:18874368 user_id:380
    送信数:39 メモリ使用量:18874368 user_id:666
    送信数:59 メモリ使用量:18874368 user_id:2982
    送信数:78 メモリ使用量:18874368 user_id:3695
    送信数:99 メモリ使用量:20971520 user_id:2367310
    送信数:112 メモリ使用量:20971520 user_id:2367353
    送信数:126 メモリ使用量:20971520 user_id:2367380
    ...
    送信数:6685 メモリ使用量:27262976 user_id:2377277
    送信数:6702 メモリ使用量:27262976 user_id:2377294
    送信数:6715 メモリ使用量:27262976 user_id:2377313
    $
    
    ※ 2021/04/15 보충:
    12시간의 대량 검증
    14MB→16MB→18MB→...→52MB
    (연)까지 계속 늘어나는 것을 확인했다.
    그러나 걸음걸이가 상당히 느려 장편이라도 어느 정도 참을 수 있었다.
    CakePHP1.3, CakePHP2 시대에 메모리가 계속 증가했기 때문에 몇 번의 실행으로 나누어 회피했지만 CakePHP4로 다시 만든 횟수는 한 번에 실행할 수 있어 처리 시간을 단축했다.
    ※ Cake PHP2에서는 모델 캐시를 끄고 Cake PHP2로 옮길 수 있을 경우 문제가 해결될 수 있지만, 적어도 Cake PHP4가 설치된 횟수에 대해서는 메모리 유출성 증가를 걱정할 필요가 없습니다.
    참고 자료: https://qiita.com/zaru/items/b3cf10c043d0304cdc34

    좋은 웹페이지 즐겨찾기