SQL操作するphpをlocalからさくらレンタルサーバへ移植する

最終更新日：20191005

#この記事の対象者
* php学習者でlocalで動くアプリケーションを持っている。
* さくらレンタルサーバのスタンダード以上のプランを使っている。

#目次
次のような流れで移植を行います。
・さくらサーバーへローカルから接続できるようにする
・アプリケーションを転送する
・さくらのコントロールパネルからデータベースを作る
・データベース接続設定に関するコードの変更
では、進めていきましょう。

#さくらサーバーへローカルから接続できるようにする
さくらサーバーへの接続はSSHという方式で行います。
##SSHとは？
ネットワークを通じて端末（サーバ）から別の端末（サーバ）とやり取りをする方法の一つです。
接続時にパスワードや公開鍵認証と呼ばれる方法で認証を行い、安全な状態で
相手の端末（サーバ）に対してコマンドを送り込んで操作できるようになります。

現在、他のネットワーク上のサーバーへインターネットを介して行うファイル移動などは
SSHで接続した上でファイルコピーを行う"SCP"コマンドを利用することが一般的です。

##Windowsの場合
###Windowsは補助ツールが必要！
ここから、Macの場合は全てterminalのコマンドを使って操作を行うことができますが、
Windowsの場合は補助ツールとしてteratermとwinscpを利用します。

###SSH接続に使う鍵セットの作成
SSHの接続認証に必要なSSH鍵のセットを準備しましょう。
鍵は接続先に保管する「公開鍵」とローカルに保管する「秘密鍵」があり、
ローカル環境で2つ同時に生成します。

TeraTermをダウンロード 
https://ja.osdn.net/projects/ttssh2

TeraTermはWindows上からSSHでサーバーにアクセスし、サーバー側でLinuxコマンドを実行するツールです。
今回は鍵を作ってSSHでアクセスして認証用の公開鍵をサーバー側に置くだけのために使います。

* TeraTermを立ち上げたら、新しい接続をキャンセルします。
* 設定⇒ssh鍵生成。
* RSAにチェック、ビット数は変更なしでOK。生成を実行。
* パスフレーズを登録して秘密鍵と公開鍵を保存します。

###公開鍵の設置

鍵を生成したら公開鍵をサーバー側に設置しましょう。（秘密鍵はlocalに保管して使います。）
まずは設置のために鍵なしでサーバーにSSH接続します。

* TreaTermでファイル⇒新しい接続（または再起動しても同じ）
* ホスト名にさくらの初期ドメイン名を入力、ポートは22でOK。
* ユーザ名はさくらのアカウント名、パスフレーズは「さくらのアカウントにログインする際の、さくらからメールで届いたパスワード」です。公開鍵設置までは鍵を生成した際のパスフレーズではありません。
* プレインパスワードを使うにチェックを入れてOK。

これで一旦TeraTermを使って鍵なしでさくらサーバー内に入りました。

* 先ほど生成した鍵のうち、公開鍵のファイルをTeraTermのウィンドウにドロップします。
* 保管場所はどこでもよいのでSCPを実行します。

公開鍵を置いたことで鍵認証ができるようになりました。
一旦ログアウトして、今度はプレインパスワードではなくRSA鍵を使うにチェックを入れて
TeraTermでさくらサーバーにつないでみましょう。

* TeraTermを再起動します。
* ホスト名にさくら初期ドメイン、ポート22でOK。
* ユーザ名にさくらアカウント名、パスは今回から「鍵生成時に決めたパスフレーズ」です。
* RSA/DSA/ECDSA/ED25519鍵を使うにチェックを入れて、秘密鍵ボタンをクリック。
* 先ほど作った秘密鍵ファイルを選択。
* OKを押して接続を開始します。

問題なくさくらサーバー内に入れていればTeraTermを使った作業は終了です。
TeraTermはSSHログインしてさくらサーバー内で設定ファイルを書き換えるなど
アプリの動作環境構築でバリバリ活躍してくれますが、今回の役目は終了です。

##Macの場合
###コマンドで鍵を作る

```:command
ssh-keygen
```
まず鍵の名前が聞かれます。通常は何も入れなくてOKです。何も入れずにenterを押すと鍵ファイルは
/あなたのホームディレクトリ/.ssh/id_rsa
/あなたのホームディレクトリ/.ssh/id_rsa.pub
になります。次にパスフレーズが聞かれるので、自由に入力しましょう。あとで使います。

id_rsa.pubは公開鍵なので、こちらをさくらサーバーに送り込みましょう。

```:command
scp ~/.ssh/id_rsa.pub <さくらアカウント名>:<さくら初期ドメイン>.sakura.ne.jp/home/<さくらアカウント名>/.ssh/authorized_keys
```
パスワードを聞かれたら「さくらのアカウントにログインする際の、さくらからメールで届いたパスワード」を入力します。

これでSSH鍵がサーバー側にセットされ、ファイルを送る準備が完了します。

###カンの良い方向け
ファイルを送る準備と言いながら"SCP"でファイルを送っているのではないか、
それなら同じようにファイルを直接送ってしまったらよかったのではと思うかもしれません。

それは正解です。
ただしsshでパスワードログインするというのはセキュリティ上推奨されないログイン方法で、
一度パスワード認証で鍵を配置し、そのあとで鍵を使ったログインに切り替えるようにします。

#アプリケーションを転送する
##Windowsの場合
###WinSCPを使ってファイルを移動させます。

* WinSCPをダウンロードします。
https://ja.osdn.net/projects/winscp/

* WinSCPを開きます。
* ログイン画面で転送プロトコルをSFTP、ホスト名はさくら初期ドメイン、ユーザ名はさくらアカウント名を入力し、設定を開きます。
* 左のメニューからSSHの認証を選び、秘密鍵を選択します。
* ここで、鍵の形式が違う場合はアラートが出ますが指示に従って新しい秘密鍵を保存して選択すればOKです。
* OKを押してログイン画面に戻り、保存⇒ログイン。
* 鍵のパスフレーズは生成時に決めたものを入力すれば接続完了です。
* さくらサーバー側は/home/アカウント名/www/の中がWEB公開用のフォルダです。PHPファイルはwww以下にアップロードします。

## Macの場合
SCPコマンドを秘密鍵認証で使ってファイルを送ります

```:command
scp -i ~/.ssh/id_rsa.pub <送りたいファイル> <さくらアカウント名>:<さくら初期ドメイン>.sakura.ne.jp/home/<さくらアカウント名>/www
```
パスフレーズが聞かれますので、先ほどssh-keygenで設定したパスフレーズを入力しましょう。
ファイルが転送されます。

#さくらコントロールパネルからデータベースを作る

##さくらサーバーコントロールパネル
サーバーの中で作業を行う分には全てSSHで接続しての作業で事足ります。
ただ、サーバーのDNS設定（ざっくりいうとサーバーに名前をつけること）などは外から行います。
そういった場合に、サーバーの外から設定を行うのがさくらコントロールパネルです。

##データベース作成
* さくらサーバーコントロールパネルからデータベースの設定⇒データベースの新規作成。

新規作成されたデータベースは最初からphpMyAdminでの操作ができるようになっています。

* ローカル環境のphpMyAdminからデータベースのSQLをエクスポートします。
* さくらサーバー側のphpMyAdminからデータベースのSQLをインポートします。
* データベースの設定画面で以下の箇所をメモ。（phpに記述する必要があります）

データベース　サーバ　：　phpから接続するときのホスト名になります。
データベース　ユーザ名　：　ユーザ名になります。
データベース　：　データベース名になります。
画面にはありませんが、データベースを使うときのパスワードも後で使います。

#さくらサーバーの環境

phpファイルはApacheのphpモジュールというもので読み込まれます。
細かい話はともかく、「CGIによる実行ではない」ということを覚えておいてください。
世の中のレンタルサーバではphpはモジュールとCGIの２通りの動かし方があり、
設定方法が違うため、参考にしなければならないドキュメントや技術記事が違うからです。

phpモジュールを使う場合、phpファイルのパーミッションは"604"にしておきます。
Windowsの場合、WINSCPでアップロードすると"604"なのでそのままでOKです。
Macの場合もローカル側で変更を加えていなければ"604"なのでそのままでOKです。

なお、以前のさくらサーバーはphpをCGIで動かしていたため、
パスやファイルのパーミッション設定が必要だったようで、その名残かさくらの公式でも
一部古いドキュメントではパーミッションが別の値で書かれています。ご注意。

#データベース接続関数の書き換え
##なぜか動かないphp

データベースもファイルも移行して、パーミッション設定も不要ならphpがもう動くのでは…？
いえいえ、phpに記述されたデータベース接続関数は
localhostで動かすための設定になったままのはずじゃないですか？

一例ですが、localhostで動かしていた時のコードはこんな感じでしょうか。

```php
function db_connecter(){
  $dbname='local_db_1';
  try {
    $pdo = new PDO('mysql:host='localhost';dbname='.$dbname.';charset=utf8','root','');
  } catch (PDOException $e) {
    exit('DbConnectError:'.$e->getMessage());
  }
  return $pdo;
}
```

new PDOの引数が完全にlocalで動かすためのコードになっているのでは？
つまり、host名やデータベース名の部分がさくらのデータベースサーバに
接続するための設定になっていないのです。

##設定変更
さくらのデータベースサーバのphpMyAdminでメモした内容を手元において、
以下のように書き換えてみましょう。

```php
function db_connecter(){
  $hostname='mysql***.db.sakura.ne.jp'; // データベースサーバ名
  $dbname='myusername_db_1'; // データベース名
  $user='myusername'; // データベースユーザ名
  $pass='********'; // データベース接続時のパスワード
  // ローカル動作確認用
  // $hostname='localhost';
  // $dbname='local_db_1';
  // $user='root'
  // $pass='';
  try {
    $pdo = new PDO('mysql:host='.$hostname.';dbname='.$dbname.';charset=utf8',$user,$pass);
  } catch (PDOException $e) {
    exit('DbConnectError:'.$e->getMessage());
  }
  return $pdo;
}
```
これでさくらのデータベースに繋がるようになりました。
移植完了です。