Laravel에서 은행 마스터 업데이트 일괄 처리

목적



은행 마스터의 Zip 파일을 아래 URL에서 다운로드하여 Laravel 배치로 은행 마스터를 정기적으로 업데이트하는 프로세스를 구현합니다.
h tp : // y. 코 m / 긴코 켄사쿠 / 긴코 신 1. 지 p

명령의 클래스 정의 추가



app/Console/Kernel.php
    protected $commands = [
        DownLoadBankMasterZipFile::class,
    ];

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('downLoadBankMaster')->dailyAt('02:00');
    }

배치 클래스 만들기



아래 명령 실행으로 배치 클래스 만들기
php artisan make:console DownLoadBankMasterZipFile --command="downLoadBankMaster"

배치 클래스의 내용



app/Console/Commands/DownLoadBankMasterZipFile.php
class DownLoadBankMasterZipFile extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'downLoadBankMaster';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '銀行マスタZIPファイルダウンロード';

    /**
     * Create a new command instance.
     *
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}


handle 메소드에 메인 처리를 작성합니다.


    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        echo '▲▲▲▲▲▲▲処理開始▲▲▲▲▲▲'.PHP_EOL;

        // ファイル名「bank_master.zip」でディレクトリ「bank/」に保存する場合
        $saveFileName = 'bank_master';
        $this->file_download('http://ykaku.com/ginkokensaku/ginkositen1.zip', 'bank', $saveFileName);

        //zipファイルを解凍せずにファイルの内容を読み取る
        $zip = new \ZipArchive();
        if (!$zip->open('bank/'.$saveFileName. '.zip')) {
            echo '▲▲▲zipファイルのオープンに失敗しました。▲▲▲'.PHP_EOL;
            exit(1);
        }

        // ginkositen1.txtというファイル名が取得できる
        $filename = $zip->getNameIndex(0);
        // ファイルポインタを取得
        $fp = $zip->getStream($filename);

        $i=0;
        while (!feof($fp)) {
            $i++;
            $line = fgets($fp);
            echo $line;
            //読取&DB更新処理書けばOK
        }
        fclose($fp);
        $zip->close();
        echo '▲▲▲▲▲▲▲処理終了▲▲▲▲▲▲'.PHP_EOL;
    }
}

PHP로 URL에서 로컬로 파일 다운로드


    /**
     * PHPでURLからローカルにファイルをダウンロードする
     *
     * @param  $url
     * @param  $dir
     * @param  $save_base_name
     * @return
     */
    private function file_download($url, $dir='.', $save_base_name='' ){
        if ( ! is_dir($dir) ){ die("ディレクトリ({$dir})が存在しません。");}
        $dir = preg_replace("{/$}","",$dir);
        $p = pathinfo($url);
        $local_filename = '';
        if ( $save_base_name ){ $local_filename = "{$dir}/{$save_base_name}.{$p['extension']}"; }
        else{ $local_filename = "{$dir}/{$p['filename']}.{$p['extension']}"; }
        if ( is_file( $local_filename ) ){ print "すでにファイル({$local_filename})が存在します<br>\n";}
        $tmp = file_get_contents($url);
        if (! $tmp){ die("URL({$url})からダウンロードできませんでした。");}
        $fp = fopen($local_filename, 'w');
        fwrite($fp, $tmp);
        fclose($fp);
    }


런타임에 발생한 오류 및 해결 방법


//zipファイルを解凍せずにファイルの内容を読み取る
$zip = new ZipArchive();

다음 오류가 발생


실제로는 App\Http\Controllers\ZipArchive 라고 하는 클래스명이라고 해석되는 것 같고,
다음과 같이 클래스 이름 앞에\를 붙여 해결
$zip = new \ZipArchive();

cron 등록해보기



crontab을 작성하면 app/Console/Kernel.php의 schedule 메소드에 작성된 배치가 지정된 시간에 작동합니다.
* * * * * php /path/to/project/artisan schedule:run 1>> /dev/null 2>&1

참조 링크



htps : // pg도. 토키 / 다타 / 아 r ゔ ぇ s / 825. HTML
h tps://sym 포 균열. bぉg. FC2. 소 m/bぉg-엔try-1891. html
htps : // 코 m / 야미 코오 @ 큐 b / ms / c0250 8f0548534 db2
htps : // 하고 싶다 l. 코 m / 쿠에 s 치온 s / 32085
h tps:// 퀵했다. 소 m/리 붙이 좋다/있어 MS/아 70d89파 988b2d9아 FBC4

좋은 웹페이지 즐겨찾기