Nプログラマです。
今回は、ローカルPCで起動させているLaravelのデータベースのやり取りを、SSHポートフォワーディングを使ってレンタルサーバのデータベースに向けるという内容です。
ちょっとニッチなケースかもしれないですが、意外と便利だったので備忘録として残します。
今回試したレンタルサーバは、バリューサーバー【まるっとプラン】
です。
注意点
今回の方法は、WordPressのデータベースを直接操作するので、試す場合はバックアップを取るようにしてください。
また、この記事ではいきなり本番のサーバで試していますが、リスキーなので開発サーバで検証を重ねて試すようにしてください。
概要
やること
- ローカルPCで起動したLaravelで、レンタルサーバ上のWordPressのデータベースに接続する
- 接続ができていることを確認するために、WordPressの投稿一覧を取得して表示してみる
前提条件
- レンタルサーバ上でWordPressのインストールと設定は完了済み
- レンタルサーバにSSH接続が可能であること。
- Laravelのプロジェクトは作成済み
経緯(長めなので飛ばしてよし)
記事内に独自テーブルからデータを取得して表示したいというケースがあったので、レンタルサーバのWordPressのデータベースに独自テーブルを追加して、それに対するCMSモドキをLaravelで作ることにしました。
独自テーブルは更新頻度が高くカラムも多い状態で、phpMyAdminで対応すると手間と時間がかかります。
さらに、ちょっとしたバリデーションも追加して入力ミスを減らそうということもあり、CMSモドキを作ろうと思い立ったわけです。
Laravel選んだのは、ちょっと使い慣れているのとORM(Eloquent)が使えるからです。
WordPressのPluginは、時間がかかりそうだったので今回は見送りました。
経緯終わり。
やってみた
Laravel側
アプリケーションのディレクトリ名はsamplesとします。
レンタルサーバのデータベースのアクセス情報を確認
サーバ側に配置しているWordPress内の直下にwp-config.phpがあります。
ここにデータベースに接続するための情報が定義されているのでメモしておきます。
メモする定数名は、以下のもの。
- DB_NAME
- DB_USER
- DB_PASSWORD
- DB_HOST
define( 'DB_NAME', 'sample' );
/** MySQL database username */
define( 'DB_USER', 'sample' );
/** MySQL database password */
define( 'DB_PASSWORD', 'sample' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
この情報は、Laravelの.envとSSHポートフォワーディングの接続時に使います。
.envの設定
プロジェクト直下に.envがあるので、先程確認したwp-config.phpのデータベースの情報を設定していきます。
変更前
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
変更後
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE="wp-config.phpのDB_NAME"
DB_USERNAME="wp-config.phpのDB_USER"
DB_PASSWORD="wp-config.phpのDB_PASSWORD"
ルーティングの定義
ルーティングで投稿記事を取得して表示する処理を書いてあげます。
クエリビルダを使い、投稿データを取得しています。
samples/routes.web.phpを開いて、以下のように書き換えます。
変更前
Route::get('/', function () {
return view('welcome');
});
変更後
Route::get('/', function () {
$posts = \DB::table('wp_posts')->get();
foreach ($posts as $post) {
echo 'Title: ' . $post->post_title . "<br>";
}
});
これで準備は完了です。
SSHポートフォワーディング
Laravelで行うデータベースのやりとりを、レンタルサーバのデータベースに転送したいのでSSHポートフォワーディングを使います。
これについて、こちらの記事を参考にしました。
SSHポートフォワーディング(トンネリング)とは: 小粋空間
コマンド(雛形)
ssh -L -N (laravelの.envのDB_PORT):(wp-configのDB_HOST):(レンタルサーバのDBの接続先ポート) (接続先)
入力が必要な情報は、丸かっこで囲っています。ここに必要な情報を入力してきます。
- Laravelの.envのポート
これは.envに記載されているポート番号(3306)を入力します。 - レンタルサーバのDBの接続先ポート
サーバにあるwp-config.phpに記載されているDB_HOST(localhost)を入力します。d
- 接続先
sshの接続先を指定します。
ValueServerの場合は以前に書いた記事がありますので、こちらを参考にしてみてください。
[ValueServer] SSH接続をする方法
実行するコマンド
必要な情報を置き換えると、こんな感じになります。
ssh -L -N 3306:localhost:3306 [バリューサーバへの接続先]
これを実行すれば、SSHポートフォワーディングができてLaravelのデータベースのやりとりが
レンタルサーバのデータベースに向くようになります。
実行中はプロンプトの応答が返ってこない状態になるので、終了するときはCtrl+cなどで終了します。
ValueServerのSSH接続はパスワード認証なので、鍵の指定がないことに注意します。
Laravelのサーバを起動
ローカルPCでLaravelのサーバを起動させます。ポート番号を18080で起動します。
php artisan serve --port=18080
サーバが起動したらブラウザで localhost:18080/ にアクセスしてみましょう。
レンタルサーバの投稿記事のタイトル一覧が表示されたらオッケーです。
お疲れ様でした。
利用が終わったらSSHポートフォワーディングは終了しておきましょう。
終わりに
今回は、ローカルPCでLaravelを起動し、レンタルサーバのWordPressのDBに接続するという内容でした。
独自テーブルに対して色々とCRUD処理をするだけなら、かなり便利だと思っています。
WordPressのテーブルに対しては、よほどのことがない限り参照のみにしておいたほうが良さそうです。
また今回の方法は、いきなり本番のサーバに接続しているので、ミスをすると結構致命的になります。
検証する時は、バックアップを取ったり、開発用サーバを準備したりすることをおすすめします。
それでは、このへんで。
バイナリー!