Laradockを使ったLaravel開発環境にBlackfireを導入し簡単にプロファイリングしてみる(Mac)

# 2019/07/04追記
- PHP ProbeのWarningについての原因と対策

---

# きっかけ

---

進行中のプロジェクトに影響を与えないよう既存システムの現状を把握したい。
そのため、`GitHub(Enterprise)`のリポジトリからソースをcloneし、ローカルでツールを利用し分析してみる。

---

ローカル環境は、構築/変更/削除が比較的楽な`Docker`で構築。
対象システムは`Lalavel`をベースにしているため、`Laradock`を選択。
標準で`Blackfire`が用意されているため、これを有効にしプロファイリングしてみる。

---

Google先生に聞いてみたが、`Laradock`+`Blackfire`で良い感じのヒットがなかったため、ここに認めてみる。
なお、ここでは諸事情によりソースのcloneは行わず、defaultのwelcomeページのプロファイリングまでとする。

---

# 環境

---

- MacbookPro:Retina:13-inch:Early 2015
    - 2.9 GHz Intel Core i5
    - 16 GB 1867 MHz DDR3
    - Intel Iris Graphics 6100 1536 MB
    - 512GB PCIe-based flash storage
        - macOSSierra:10.12.6-x86_64

---

# 前提条件
# 事前準備

---

## Homebrew
- [【Mac】XcodeをまるまるインストールせずにHomebrewをインストール - ぺーぱーふぇいす](http://paperface.hatenablog.com/entry/2018/08/11/%E3%80%90Mac%E3%80%91Xcode%E3%82%92%E3%81%BE%E3%82%8B%E3%81%BE%E3%82%8B%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%9B%E3%81%9A%E3%81%ABHomebrew%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9)

---

## Docker(edge)
```zsh
❯ brew cask install docker-edge
```
※ `brew cask install docker` でもOK

---

# 参考にしたサイト

---

## Laradock
- [LaravelとLaradockを使ったチームでの開発環境を用意する vol.1 ~Laradock設定編~ - Qiita](https://qiita.com/dev_satsuki/items/e2769925da33bfa77df5) ( [LaravelとLaradockを使ったチームでのphpプロジェクトの始め方 1~Laradock設定編~](https://medium.com/dev-satsuki-hq/laravel%E3%81%A8laradock%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%81%E3%83%BC%E3%83%A0%E3%81%A7%E3%81%AEphp%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%A7%8B%E3%82%81%E6%96%B9-1-laradock%E8%A8%AD%E5%AE%9A%E7%B7%A8-d8afd66e4b04) )

---

- [LaravelとLaradockを使ったチームでの開発環境を用意する vol.2 ~Laravelインストール編~ - Qiita](https://qiita.com/dev_satsuki/items/5ce8b98100997f230775)

---

## Blackfire
- [PHPのプロファイリングが出来るblackfireを試してみた - 日頃の行い](https://arata.hatenadiary.com/entry/2017/10/16/090000)

---

# 参考にしたサイトとの差分

---

- (vol.1)ディレクトリ名

```diff
-your
+test
```

---

- (vol.1)laradockのenv

```diff:.laradock-env
-APP_CODE_PATH_HOST=../
+APP_CODE_PATH_HOST=../test_laravel_project
```

---

```diff:.laradock-env
-DATA_PATH_HOST=~/.laradock/data
+DATA_PATH_HOST=~/.laradock_test_project/data
```

---

```diff:.laradock-env
-INSTALL_BLACKFIRE=false
+INSTALL_BLACKFIRE=true
```

---

- (vol.1)setup.sh

```diff:setup.sh
-cp -f conf/.laradock-env ../laradock-your_project/.env
+cp -f conf/.laradock-env ../laradock_test_project/.env
```

---

- (オリジナル).env

※ログインした状態の [Installation - Blackfire](https://blackfire.io/docs/up-and-running/installation) ページ `Client Id` `Client Token` `Server Id` `Server Token` を、それぞれコピー&ペースト
※ここで編集するのは個人アカウント利用のため

---

```diff:.env
-BLACKFIRE_CLIENT_ID=<client_id>
-BLACKFIRE_CLIENT_TOKEN=<client_token>
+BLACKFIRE_CLIENT_ID=＊＊******-****-****-****-************
+BLACKFIRE_CLIENT_TOKEN=****************************************************************
```

---

```diff:.env
-BLACKFIRE_SERVER_ID=<server_id>
-BLACKFIRE_SERVER_TOKEN=<server_token>
+BLACKFIRE_SERVER_ID=＊＊******-****-****-****-************
+BLACKFIRE_SERVER_TOKEN=****************************************************************
```

---

- (オリジナル)php-fpmのWarning対策

---

```diff:test-project/laradock_test_project/php-fpm/Dockerfile
    && rm /tmp/xhprof.tar.gz \
+    && COPY ./xhprof.ini /usr/local/etc/php/conf.d \
;fi

-COPY ./xhprof.ini /usr/local/etc/php/conf.d

###########################################################################
```

---

- (vol.1)dockerの起動

```diff
-docker-compose up --build -d nginx postgres redis workspace
+docker-compose up --build -d nginx postgres redis workspace blackfire
```

---

- (vol.1)`docker-compose ps`

```diff
+laradock_blackfire_1          blackfire-agent                  Up      8707/tcp
```

---

- (vol.2)Docker操作に使うコマンド

```diff
-docker-compose up -d nginx postgres workspace redis
+docker-compose up -d nginx postgres workspace redis blackfire
```

---

- (オリジナル)Laravelのインストール(※バージョン指定の場合のみ)

```diff
-composer create-project --prefer-dist laravel/laravel ./
+composer create-project --prefer-dist laravel/laravel ./ "5.5.*"
```

---

- (vol.2)Laravelの設定

---

```diff:.env
-DB_CONNECTION=mysql
-DB_HOST=127.0.0.1
-DB_PORT=3306
+DB_CONNECTION=pgsql
+DB_HOST=postgres
+DB_PORT=5432
```

---

```diff:.env
-DB_DATABASE=homestead
-DB_USERNAME=homestead
+DB_DATABASE=default
+DB_USERNAME=default
```

---

- (vol.2)Laravel設定ファイルの配布準備

```diff:setup.sh
-cp -f conf/.**laravel**-env ../your_laravel_project/.env
+cp -f conf/.**laravel**-env ../test_laravel_project/.env
```

---

- (Blackfire)

```diff
-2. サーバにblackfire agentのインストール
```
※Laradockでインストールするため不要

---

- (vol.2)Blackfire Companionデザイン

<img width="840" alt="Screenshot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116864/9dc76d53-a76e-731e-4db7-78d30a8cee61.png">

---

# その他

---

- (オリジナル)php-fpmのWarning対策の事象

> PHP Warning:  PHP Startup: Unable to load dynamic library 'tideways.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20170718/tideways.so (/usr/local/lib/php/extensions/no-debug-non-zts-20170718/tideways.so: cannot open shared object file: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20170718/tideways.so.so (/usr/local/lib/php/extensions/no-debug-non-zts-20170718/tideways.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

---

※無条件で 'tideways.so' 利用状態になっているため。`Laradock`の [issue](https://github.com/laradock/laradock/issues/2169) 参照。

---

- PHP ProbeのWarning

<img width="839" alt="Screenshot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116864/03946443-468a-4762-9d97-96ff36f6a282.png">

---

## 2019/07/04追記

`php-fpm`のProbeが古かった様です・・・再構築して解消
(※これから構築する方は最新がインストールされるので問題なし)

---

### 参考
- [docker-composeでbuildする時にcacheを使わない - Qiita](https://qiita.com/setouchi/items/e01557ae4647b8e3b1bc)
- [Upgrade - Blackfire](https://blackfire.io/docs/up-and-running/upgrade)

---

# 最後に

---

内容ボリュームが盛りだくさんなため、ここでは元記事の差分のみ記載しました。
`スライドモード`も試してみたかったため、やたらと区切った分読みにくいかもしれません。
誰かの参考になればと思いUPしましたが、とりあえず自分用の作業記録として残しておきます。

---

別途、`Laradock`の [issue](https://github.com/laradock/laradock/issues/1003) で`Graphviz`のインストールが出来るようにする提案がありますが、先行してそのPRに倣って`phpDocumentor`も導入してみたいと思っています。

---

その他、静的解析ツール群も入れてみたいと思っていますが、`Laravel`公式が`StyleCI`を導入している点が悩ましい・・・無料枠・・・

- [LaravelでコードチェックサービスStyleCIを利用してみる | Code I-yusuke](http://i-yusuke.com/entry/styleci-laravel/)

---

Plan Bとして、有志の方が`PHP-CS-Fixer`で`StyleCI`と同等のルールを作成しているので、そちらを利用したいと思っています。

- [Laravel 5.5 の妥協できる PHP-CS-Fixer 設定ファイルが完成した – oki2a24](https://oki2a24.com/2019/06/16/compromise-php-cs-fixer-configuration-files-for-laravel-5-5-is-complete/)

---

ここまで、老頭児(残滓)プログラマーがお伝えいたしました。
現場からは以上です。