Heroku + PHP + wkhtmltopdf のサンプル

まずは<a href="/nanananamememe/items/56752bd5b3a00537ee8f">前回の記事</a>を読んでね。

プログラミングをしている健全な男子たるもの、スクリーンショットに直接メモ書きしてローカル保存したくなるのは自然の法則と言えるでしょう。
でも都度々々アプリを起動するのは超面倒だし、ある程度の過去データーも編集して上書き保存したい。
ということで作ろう。

# 準備

## 前回の記事のコマンドを使用してherokuアプリをサックリ生成。

```text:コマンド
$ curl -o- https://raw.githubusercontent.com/nanananamememe/open_heroku/master/make.sh | bash
```
```text:出力結果
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   261  100   261    0     0   1003      0 --:--:-- --:--:-- --:--:--  1007
mkdir: my_site: File exists
Reinitialized existing Git repository in ~/my_site/.git/
Creating app... done, ⬢ hoge-piyo-99999
https://hoge-piyo-99999.herokuapp.com/ | https://git.heroku.com/hoge-piyo-99999.git
On branch master
nothing to commit, working directory clean
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 299 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> PHP app detected
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote:        NOTICE: No runtime required in composer.lock; using PHP ^5.5.17
remote:        - apache (2.4.20)
remote:        - nginx (1.8.1)
remote:        - php (5.6.29)
remote: -----> Installing dependencies...
remote:        Composer version 1.2.4 2016-12-06 22:00:51
remote: -----> Preparing runtime environment...
remote:        NOTICE: No Procfile, using 'web: vendor/bin/heroku-php-apache2'.
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing...
remote:        Done: 13.5M
remote: -----> Launching...
remote:        Released v3
remote:        https://hoge-piyo-99999.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy.... done.
To https://git.heroku.com/hoge-piyo-99999.git
 * [new branch]      master -> master
```

ディレクトリ名を変更、名前はスクリーンショットにメッセージ書くのでss_messengerに。cdで移動。

```text:コマンド
$ mv my_site ss_messenger
$ cd ss_messenger
```

## MySQL(ClearDB)アドオン追加。下記コマンドを実行。

```text:コマンド
$ heroku addons:create cleardb:ignite
```
```text:出力結果
Creating cleardb:ignite on ⬢ hoge-piyo-99999... free
Created cleardb-aerodynamic-24359 as CLEARDB_DATABASE_URL
Use heroku addons:docs cleardb to view documentation
```

## DBちゃんと作れたか、確認。
コマンドを叩く。

```text:コマンド
$ heroku addons:info cleardb
```
```text:出力結果
=== cleardb-hogehoge-99999
Attachments:  hoge-piyo-99999::CLEARDB_DATABASE
Installed at: Tue Dec 13 2016 22:05:25 GMT+0900 (JST)
Owning app:   hoge-piyo-99999
Plan:         cleardb:ignite
Price:        free
State:        created
```

作成途中だと上記のStateの値がcreatingになる。

## PHPからDB接続ができるか確認。
公式ドキュメントにphpのサンプルがあるのでそれを参考に。
https://devcenter.heroku.com/articles/cleardb#using-cleardb-with-php

```text:コマンド
$ rm index.html;
$ echo '<?php' > index.php;
$ echo 'extract(parse_url(getenv("CLEARDB_DATABASE_URL")));' >> index.php;
$ echo 'var_dump((new mysqli($host,$user,$pass,substr($path,1))->client_version));' >> index.php;
$ git add .;
$ git commit -a -m 'db test';
$ git push heroku master;
$ heroku open;
```

```text:出力結果
int(50012)
```

## ビルドパッケージにwkhtmltopdfを追加。
複数ビルドパッケージを利用できるよう heroku/heroku-buildpack-multi を使用。

```text:コマンド
$ heroku buildpacks:set 'https://github.com/heroku/heroku-buildpack-multi.git';
$ echo 'https://github.com/heroku/heroku-buildpack-php.git' >> .buildpacks;
$ echo 'https://github.com/rafaelp/heroku-buildpack-wkhtmltopdf.git' >> .buildpacks;
$ git add .;
$ git commit -m 'Add multi-buildpack';
$ git push heroku master;
```

```text:一部出力結果
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Multipack app detected
remote: =====> Downloading Buildpack: https://github.com/heroku/heroku-buildpack-php.git
remote: =====> Detected Framework: PHP
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote:        NOTICE: No runtime required in composer.json; requirements
remote:        from dependencies in composer.lock will be used for selection
remote:        - php (7.1.0)
remote:        - apache (2.4.20)
remote:        - nginx (1.8.1)
remote: -----> Installing dependencies...
remote:        Composer version 1.2.4 2016-12-06 22:00:51
remote:        Loading composer repositories with package information
remote:        Installing dependencies from lock file
remote:          - Installing symfony/process (v3.2.1)
remote:            Loading from cache
remote:        
remote:          - Installing knplabs/knp-snappy (0.4.3)
remote:            Loading from cache
remote:        
remote:        Generating optimized autoload files
remote: -----> Preparing runtime environment...
remote:        NOTICE: No Procfile, using 'web: vendor/bin/heroku-php-apache2'.
remote: -----> Checking for additional extensions to install...
remote: =====> Downloading Buildpack: https://github.com/rafaelp/heroku-buildpack-wkhtmltopdf.git
remote: =====> Detected Framework: wkhtmltopdf
remote: -----> Installing wkhtmltopdf 0.12.2.1
remote:        Writing profile script
remote: Using release configuration from last framework (wkhtmltopdf).
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing...
remote:        Done: 56.8M
remote: -----> Launching...
remote:        Released v11
remote:        https://hoge-piyo-99999.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy.... done.
```

インストールできたか確認。

```text:コマンド
$ heroku run wkhtmltoimage -V
```

```text:出力結果
Running wkhtmltoimage -V on ⬢ hoge-piyo-99999... up, run.2087 (Free)
wkhtmltoimage 0.12.2.1 (with patched qt)
```

## wkhtmltopdfの操作用にcomposerにsnappy追加。
vendor の中身を push しないよう .gitignore に vendor を追加。
ついでに動作の確認も

```text:コマンド
$ echo 'vendor' > ./.gitignore;
$ composer require knplabs/knp-snappy;
$ echo '<?php' > index.php;
$ echo 'require "vendor/autoload.php";' >> index.php;
$ echo 'use Knp\Snappy\Image;' >> index.php;
$ echo '$snappy = new Image("wkhtmltoimage");' >> index.php;
$ echo 'header("Content-Type: image/jpeg");' >> index.php;
$ echo 'echo $snappy->getOutput("http://www.github.com");' >> index.php;
$ git add .;
$ git commit -a -m wkhtmltoimage;
$ git push heroku master;
$ heroku open;
```


ブラウザに画像に変換されたgithubのサイトが表示されれば成功。

とりあえず今回はここまで、続きは次回に。