中規模のECを営む私のお客さんのところでは、自社製品を持ち出荷するゆえに、自社のウェブで販売するのみではなく、他社でのウェブサイトでも製品が売られています。となると、そこからも注文データが来ます。
その発注データは、ウェブサービスを使用したAPIを使用して取得、というようなものではなく、彼らが生成した注文データをCSVファイルとして指定のサーバーに置かれ、それを毎日sftpでダウンロードして、システム内に取り込みます。
また、逆に自社サイトで販売した注文情報を、出荷や解析の目的で他のサーバーにsftpでアップロードというケースもあります。
ここで重要なのは、パブリックキーを使用したsftpのコミュニケーションが必要なことです。
そこで登場するのが、以前会員編集フォーム紹介した、Laravel Collective
です。
Laravel Collectiveのインストール
最初に、以下をコマンドラインで実行します。
$ composer require "laravelcollective/remote":"^5.3.0"
この実行で、必要なライブラリがインストールされ、composer.jsonが更新されます。
次に、config/app.php
のファイルをエディタで開き、以下を追加します。
'providers' => [ // ... Collective\Remote\RemoteServiceProvider::class, // ... ], 'aliases' => [ // ... 'SSH' => Collective\Remote\RemoteFacade::class, // ... ],
設定
SSHのパッケージがインストールされたところで、次は設定です。Laravel用に開発されたパッケージでは、たいていはパッケージ独自の設定ファイルを、config/
ディレクトリに作成します。
以下を、コマンドラインで実行してください。
$ php artisan vendor:publish --provider="Collective\Remote\RemoteServiceProvider"
この実行により、config/remote.php
の設定ファイルが作成されます。
エディターで、そのファイルを開き、acme
エントリーを追加します。acme
でなくても、名前はなんでもよいです。
'default' => 'production', 'connections' => [ 'production' => [ 'host' => '', 'username' => '', 'password' => '', 'key' => '', 'keytext' => '', 'keyphrase' => '', 'agent' => '', 'timeout' => 10, ], 'acme' => [ 'host' => env('ACME_HOST'), // sftp先 'username' => env('ACME_USERNAME'), // ログイン名 'password' => '', // 'key' => base_path(env('ACME_KEY')), // パブリックキーファイルのパス名', 'keytext' => '', 'keyphrase' => '', 'agent' => '', 'timeout' => 10, ], ],
見ての通り、このファイルにはデフォルトとして、すでにproduction
がありますが、それには触らず、ここではacme
の配列を新設しました。開発サイトでのテストも考えて、いろいろな情報をここで設定できるのは便利です。
今回は、バージョン管理にプライベートの値が入らないように、.env
で指定するようにしました。特に、大きい値のパブリックキーを含むファイルを、key
で指定できるのも便利です。このファイルは、.gitignore
で必ずバージョン管理から排除が必要ですね。
keyphrase
は、パブリックキーを生成したときに指定したパスワードを入れますが、パスワード指定なしで作成することが多いです。それでも十分セキュアであるのでここでは空とします。
.env
では、以下のような変数を追加します。
.. ACME_HOST=foo.google.com ACME_USERNAME=foo ACME_KEY=config/keys/test.pem ..
以上でテスト可能となります。もし、sftp先でsftpのみで設定されていないなら、
$ php artisan tinker
を実行して、接続テストができます。以下では、ssh
でacmeに接続して、ls
コマンドを実行しました。
Psy Shell v0.7.2 (PHP 5.6.25 — cli) by Justin Hileman >>> use SSH; => null >>> SSH::into('acme')->run(['ls']); [foo@acme] (acme) data.csv => null >>>
sftpでファイルのダウンロード・アップロード
ここまで来たら、あとは簡単です。プログラムの中で以下を実行するだけです。
ファイルのダウンロードは、
SSH::info('acme')->get('data.csv', storage_path('data.csv'));
ファイルのアップロードは、
SSH::info('acme')->put(storage_path('data.csv'), 'data.csv');
あたかも、コマンドラインで実行するような軽さですね。
メルマガ購読の申し込みはこちらから。