[Laavel 5.1] 배치 작업을 위한 명령줄 작성 도구

개시하다


데이터베이스에 주 데이터를 설정하고 싶습니다.
하지만 건수가 많으면 일괄 처리할 수밖에 없다.
그럼에도 불구하고 일괄 처리는 fluent에 쓰고 싶어요!그런 너한테
Laavel에서는 명령행 도구 개발도 지원합니다.

하고 싶은 일


명령줄 도구를 사용하여 로컬 측면의 CSV 파일을 DB에 설정하는 프로세스를 원합니다.

구성도



컨디션


Name
version
Laravel
5.1
MySQL
5.7.17-0ubuntu0.16.04.2
PHP
7.1.4-1
artisan
5.1.46 (LTS)

로컬에서 DB 호출 시 고려 사항


포트 번호를 변경합니다.
Homestead의 MySQL 포트는 3306으로 컨트롤러에서 연결할 때 33060으로 연결해야 한다.

대응


많은 대책을 고민했다
  • ssh를 연결하여 서버 측면에서 명령행 도구를 실행
  • → 로컬 CSV 파일을 서버 측에서 인식해야 하므로 번거로워 보임
  • Homestead 측 포트를 3306에서 33060으로 통일
  • →안전 측면과 집행 환경 등이 바뀌어 오히려 번거롭다
  • 따라서 컨트롤러에서 실행되는 경우port=33060, 서버 측에서 실행되는 경우port=3306에서 시작할 수 있도록 분할되었습니다.config/database.php의 문장 첫머리에 이것을 기술하세요.
    2017/08/02 개정:port판정의 엄격화
    config/database.php
    /**
     * 修正前:ssh接続後、Homestead上コンソールから
     * $ php artisan migrate
     * でも実行しようものなら
     *  [PDOException]
     *  SQLSTATE[HY000] [2002] Connection refused
     * エラーが発生する不具合を修正
     */
    /*
    $port = 3306;
    if (php_sapi_name() == 'cli')
    {
        $port = 33060;
    }
    */
    $port = 3306;
    $ip   = gethostbyname(gethostname());
    
    /**
     * クライアント側からの接続で、かつipアドレスがサーバー自身でなければportに33060を設定
     */
    if (php_sapi_name() === 'cli' && $ip !== '127.0.0.1')
    {
        $port = 33060;
    }
    
    또한 DB별 설정 조건에 추가'port'=>$port하십시오.
    config/database.php
    'mysql'         => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
        'port'      => $port,
    ],
    
    따라서 콘솔에서 연결할 때port=33060, 로컬 연결할 때port=3306에서 연결할 수 있다.
    여기에 설정할 수 있다면 드디어 지령선 도구 개발을 추진할 수 있을 것이다.

    사전 준비


    Command 파일 생성

    php artisan에서 명령행 도구를 생성할 수 있습니다.
    console
    $ php artisan make:console SampleCommand --command=sample
    
    --command도 실행 시 이름을 설정할 수 있습니다.
    그나저나 --command=samplegroup:sample라면 samplegroup로 조를 나눈다.
    만약 성공한다면, 나는 app/Console/Commands/SampleCommand.php 파일을 생성할 것이라고 생각한다.

    Command에 등록하는 경로


    이렇게php artisan sample만 걸어도 전화를 할 수 없다.app/Console/Kernel.php에 artisan 명령으로 등록합니다.
    app/Console/Kernel.php
    protected $commands = [
        Commands\Inspire::class,
        Commands\Sample::class, //この行を追加する
    ];
    
    만일의 경우를 대비해 로그인한 후php artisan list 명령을 두드려 새로 추가된 명령을 등록했는지 확인한다.

    실행 처리


    그러면 실제 SampleCommand.php에 테스트 코드를 기술하여 처리 여부를 확인합니다.
    app/Console/Commands/SampleCommand.php
    namespace App\Console\Commands;
    use Illuminate\Console\Command;
    class Sample extends Command
    {
        protected $signature = 'sample';
        protected $description = 'Command description';
        public function __construct() {
            parent::__construct();
        }
        // 実際の処理はhandle内に記述していく
        public function handle() {
            $this->info('Processing start.');
            $progressBar = $this->output->createProgressBar(5);
            $i = 0;
            while ($i++ < 5) {
                sleep(1);
                $progressBar->advance();
            }
            $progressBar->finish();
            echo "\n";
            $this->info('Processing end.');
        }
    }
    
    실행 결과
    $ php artisan sample
    
    Processing start.
     5/5 [============================] 100%
    Processing end.
    
    물론 라벨 기능을 사용했기 때문에 모델, 서비스Provider 등 평소 사용하던 기능을 모두 이용할 수 있다.
    Command반에서는 대화 처리용 학급도 충실해 사용하기 편하다.

    참고 자료


    아래 문헌을 참고하게 해 주세요.
  • Laavel에서 명령줄 응용 프로그램 만들기
  • Laravel5.1 Artisan 콘솔
  • 감상


    처음에는 자기가 썼는데 원래 PHP가 썼는데 모델을 쓰려고 찾아봤는데 아주 간단하게 이루어졌어요.너무 쉬워서 깜짝 놀랐어.
    비즈니스 논리를 Provider에 기술하면 시험도 간단해진다.
    나는 개인적으로 진도표를 간단하게 실현할 수 있는 것을 가장 좋아한다.

    좋은 웹페이지 즐겨찾기