[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으로 연결해야 한다.
대응
많은 대책을 고민했다
명령줄 도구를 사용하여 로컬 측면의 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으로 연결해야 한다.
대응
많은 대책을 고민했다
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.phpprotected $commands = [
Commands\Inspire::class,
Commands\Sample::class, //この行を追加する
];
만일의 경우를 대비해 로그인한 후php artisan list
명령을 두드려 새로 추가된 명령을 등록했는지 확인한다.
실행 처리
그러면 실제 SampleCommand.php
에 테스트 코드를 기술하여 처리 여부를 확인합니다.
app/Console/Commands/SampleCommand.phpnamespace 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반에서는 대화 처리용 학급도 충실해 사용하기 편하다.
참고 자료
아래 문헌을 참고하게 해 주세요.
$ php artisan make:console SampleCommand --command=sample
protected $commands = [
Commands\Inspire::class,
Commands\Sample::class, //この行を追加する
];
그러면 실제
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반에서는 대화 처리용 학급도 충실해 사용하기 편하다.
참고 자료
아래 문헌을 참고하게 해 주세요.
감상
처음에는 자기가 썼는데 원래 PHP가 썼는데 모델을 쓰려고 찾아봤는데 아주 간단하게 이루어졌어요.너무 쉬워서 깜짝 놀랐어.
비즈니스 논리를 Provider에 기술하면 시험도 간단해진다.
나는 개인적으로 진도표를 간단하게 실현할 수 있는 것을 가장 좋아한다.
Reference
이 문제에 관하여([Laavel 5.1] 배치 작업을 위한 명령줄 작성 도구), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tosite0345/items/963378cb21e3d90108c5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여([Laavel 5.1] 배치 작업을 위한 명령줄 작성 도구), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tosite0345/items/963378cb21e3d90108c5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)