PHPxさくらサーバー デプロイ攻略＿開発環境編～.env情報の取得～※Windowsベース

## 本稿の目的
PHPで作成したアプリをノーヒントでデプロイするのはわからないことだらけですごく大変でした…
自分の行ったデプロイまでの手順を示し、みんなのPHPアプリを世に解き放つお手伝いがしたい！

ということで、ここでは開発環境側の準備に関して解説します。
全体の流れはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/edcbfc4a-e30f-3558-d316-685c329e7d78.png)


## .envファイルの準備
このようなデータベースへのアクセス設定がphpファイルに記載されているとする。
```php:初期状態php
        $db_name = "sample_db"; //データベース名
        $db_id   = "root"; //アカウント名
        $db_pw   = ""; //パスワード：MAMPは'root'
        $db_host = "localhost"; //DBホスト
```
このままだとセキュリティ上のリスクがある状態なので,
ソースコード外に.envファイルを作成し、そこに情報を格納したい
下記のようなファイルをindex.php階層に配置する。
```.env
DB_NAME = "sample_db"
DB_ID = "root"
DB_pw = ""
DB_host = "localhost"
```
::: note alert
**注意**
`.gitignore`に追加しておかないとハッキングされるよ！
一度ステージングするとキャッシュクリアしない限り、コミット監視対象に入ってしまうので、気をつけましょう。
APIキー含め漏洩するとまずいものはgitignoreに追加する。
代わりに.env.exampleというテンプレートファイルを公開したりするよ！
:::

そして最終的に下記のような形式で読み込みたい。

```php:ゴール.php
        $db_name = $_ENV['DB_NAME']; //データベース名
        $db_id   = $_ENV['DB_USER']; //アカウント名
        $db_pw   = $_ENV['DB_PASS']; //パスワード：MAMP'root'
        $db_host = $_ENV['DB_HOST']; //DBホスト
```
**※詳細は終盤にて**

::: note 
**ここでの到達点**
読み取りたい.envファイルが準備できた
:::

## ※XAMMP使用時の設定確認
環境変数$_ENVを有効かしておく必要があります。↓
念の為確認(win)
https://jobtech.jp/php/4718/#:~:text=XAMPP%E7%B5%82%E4%BA%86%E6%99%82%E3%81%AB%E3%82%A8[…]5%82%E4%BA%86%E3%81%95%E3%81%9B%E3%81%BE%E3%81%99%E3%80%82
↓設定変更方法
https://produce-web.net/environment-variable/


::: note warn
また、xammpのSQLが死ぬ可能性があるので、事前バックアップを行いましょう。
復旧方法はこちらを参考に↓
:::
https://ao-system.net/note/232


::: note 
**ここでの到達点**
＄ENVが使えるようになった。
:::

## Cpmposerをインストールする
### 1. まずcomposerコマンドを利用可能にする
下記よりインストーラ`Commposer-Setup.exe`をダウンロード

https://getcomposer.org/download/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/dcf0ae9e-5d85-367f-ae9a-ad2ba07b1397.png)

インストーラを起動し、`install for all users`を選択。(個人端末はこれでOK)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/9a815b4d-2690-0cdf-f86a-9ff4346cead1.png)

アンインストーラーをどうするか聞かれる。一応もらっておきたいので、チェックを入れずに`Next`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/be72a991-c704-2752-28bd-484a21c9ade7.png)

使用しているphp.exeを指定。
`Add this PHP to your path?`にチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/1fb49768-0963-8e6f-278f-6e03de79a2a4.png)

:::note warn
**なんのための`path`？**
composer側からphpのコマンドを実行するためには環境変数に実行ファイルのパスを含めてあげて、「phpはここにいるよ」と教えてあげる必要がある。
※composerのパッケージ構成のphpバージョンはこのphpファイルのバージョンになるらしい
:::
<br>

プロキシの設定はどうする？と聞かれるので、設定せずに'Next'をクリック(通常不要なはず)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/45b1ece1-635a-92c3-52fa-a69d1b4960cd.png)

これまで選択されたものが表示される。問題なければ`Install`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/db4b6fef-66c3-547d-ecbe-a239c617f370.png)

完了。と見せかけて重要なことが書いてあります。
読んだら`Next`でおしまい
> 動いているプログラムが環境の変化に気づかないかもしれないので、ターミナルを新規で起動するようにね。

そう、このあとコマンドを実行して環境構築をしていくのですが、そのときにcomposerコマンドが動かないことがあります。

その場合はすべてのウインドウを閉じて、なんちゃらかんちゃら
全部の代るを閉じて全部のプログラムも落とした状態で再スタートをする。ログオフしてログインするのが確実です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/bc4a1125-562d-c345-b70c-352a7b402128.png)

::: note 
**ここでの到達点**
ターミナル上で`composer`コマンドが実行できるようになった
:::

---

### 2. phpdotenvのインストール
composerのインストールはまだまだ続きます。
続いて、実際の間髪環境のフォルダ内に必要なパッケージをインストールするための準備作業です。

今回デプロイの対象となるプロジェクトフォルダです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/13809c13-af5c-d56e-ab23-c2decd46a06b.png)
直下に`composer.json`というファイルを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/47739404-5218-f26d-d8f3-d474b2503750.png)

::: note alert
**注意**
初回インストール時はファイルには`{}`と記載しておく
無記入だと次の工程が進まない
:::


ターミナルを起動して(powershellでもgitbashでもなんでもＯＫ)
下記コマンドを実行しましょう。

```powershell:terminal
#index.phpの親フォルダに移動するよ。
cd プロジェクトフォルダ　

#そこにcomposerをインストールするよ
composer install

#下記のようなメッセージが出るよ
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.                                                                                                                                                
Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Writing lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Generating autoload files
```



```powershell:terminal
#プロジェクトフォルダに移動した状態で下記コマンドを実行
composer require vlucas/phpdotenv 

#下記表示される。なんやかんや色々出てくるが、問題ない
./composer.json has been updated
Running composer update vlucas/phpdotenv
Loading composer repositories with package information
Updating dependencies
Lock file operations: 6 installs, 0 updates, 0 removals
  - Locking graham-campbell/result-type (v1.1.2)
  - Locking phpoption/phpoption (1.9.2)
  - Locking symfony/polyfill-ctype (v1.28.0)
  - Locking symfony/polyfill-mbstring (v1.28.0)
  - Locking symfony/polyfill-php80 (v1.28.0)
  - Locking vlucas/phpdotenv (v5.6.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 6 installs, 0 updates, 0 removals
    Failed to download symfony/polyfill-php80 from dist: The zip extension and unzip/7z commands are both missing, skipping.                                                                            
The php.ini used by your command-line PHP is: C:\xampp\php\php.ini                                  
    Now trying to download from source
  - Syncing symfony/polyfill-php80 (v1.28.0) into cache
    Failed to download symfony/polyfill-mbstring from dist: The zip extension and unzip/7z commands are both missing, skipping.                                                                         
The php.ini used by your command-line PHP is: C:\xampp\php\php.ini                                  
    Now trying to download from source
  - Syncing symfony/polyfill-mbstring (v1.28.0) into cache
    Failed to download symfony/polyfill-ctype from dist: The zip extension and unzip/7z commands are both missing, skipping.                                                                            
The php.ini used by your command-line PHP is: C:\xampp\php\php.ini                                  
    Now trying to download from source
  - Syncing symfony/polyfill-ctype (v1.28.0) into cache
    Failed to download phpoption/phpoption from dist: The zip extension and unzip/7z commands are both missing, skipping.                                                                               
The php.ini used by your command-line PHP is: C:\xampp\php\php.ini                                  
    Now trying to download from source
  - Syncing phpoption/phpoption (1.9.2) into cache
    Failed to download graham-campbell/result-type from dist: The zip extension and unzip/7z commands are both missing, skipping.                                                                       
The php.ini used by your command-line PHP is: C:\xampp\php\php.ini                                  
    Now trying to download from source
  - Syncing graham-campbell/result-type (v1.1.2) into cache
missing, skipping.
The php.ini used by your command-line PHP is: C:\xampp\php\php.ini
    Now trying to download from source
  - Syncing vlucas/phpdotenv (v5.6.0) into cache
  - Installing symfony/polyfill-php80 (v1.28.0): Cloning 6caa57379c from cache
  - Installing symfony/polyfill-mbstring (v1.28.0): Cloning 42292d99c5 from cache
  - Installing symfony/polyfill-ctype (v1.28.0): Cloning ea208ce43c from cache
  - Installing phpoption/phpoption (1.9.2): Cloning 80735db690 from cache
  - Installing graham-campbell/result-type (v1.1.2): Cloning fbd48bce38 from cache
  - Installing vlucas/phpdotenv (v5.6.0): Cloning 2cf9fb6054 from cache
Generating autoload files
6 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
Using version ^5.6 for vlucas/phpdotenv
```
`vondor`フォルダ内に`vlucas/phpdotenv`フォルダが表示され、`composer.json内の"require"`に情報が追加される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562770/71900902-fe30-53db-8bee-4b4cc4289b0d.png)

ここまで来ていれば、ほぼほぼ問題ない。
実際にプログラム中で使用していく。

::: note 
**ここでの到達点**
PHPファイル内にて`phpdotenv`が使用できるようになった
:::

---
### 3. ソースコードの変更
下記に従い、データベース接続等.envに記載した設定を読み取る処理を記入する。
```diff_php:DB_conn_sample.php
<?php
//編集前
-

//編集後
+ //必要なパッケージを自動で読み込むための記述
+ require __DIR__ . '/vendor/autoload.php';
+ //phpdotenvの機能を使って__DIR__=ファイルの存在する階層にある.envを指定する
+ $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
+ //.env中の設定値をロードし、$_ENVとして使用できるようにする
+ $dotenv->load();


//DB接続関数：db_conn() 
//※関数を作成し、内容をreturnさせる。
//※ DBname等、今回の授業に合わせる。
function db_conn($str_db_name){
    try {
//編集前　※xammp設定直接記入
-        $db_name = "sample_db"; //データベース名
-        $db_id   = "root"; //アカウント名
-        $db_pw   = ""; //パスワード：MAMPは'root'
-        $db_host = "localhost"; //DBホスト

//編集後　
+        $db_name = $_ENV['DB_NAME']; //データベース名
+        $db_id   = $_ENV['DB_USER']; //アカウント名
+        $db_pw   = $_ENV['DB_PASS']; //パスワード：MAMPは'root'
+        $db_host = $_ENV['DB_HOST']; //DBホスト
        $pdo = new PDO('mysql:dbname=' .$db_name. ';charset=utf8;host=' .$db_host, $db_id, $db_pw);
        return $pdo;
    } catch (PDOException $e) {
        exit('DB Connection Error:' . $e->getMessage());
    }
}
```

実際に$db_name等を取得した直後に
```php:confirm.php
        //　～処理～
        $db_name = $_ENV['DB_NAME']; //データベース名
        $db_id   = $_ENV['DB_USER']; //アカウント名
        $db_pw   = $_ENV['DB_PASS']; //パスワード：MAMPは'root'
        $db_host = $_ENV['DB_HOST']; //DBホスト

        //テスト用
        echo $db_name;
        exit ; 
        //～処理～
```
というように記載し、狙い通りの値が取得できていることを確認する。

::: note 
**ここでの到達点**
開発環境内で.envファイルの中身をPHPファイルが取得できる状態になった
:::