SynologyのNASでrep2のImageCache2を動作させる際のTips

###SynologyのNASでImageCache2(ic2)を動作させる
SynologyのNASは非常に高機能で、HTTPサーバーとして動作させることができるのでrep2を動かそうとした際に、ic2の設定でハマったのでその部分だけ書きます。

- Web Station
- Apache2.2
- PHP5.6
- phpMyAdmin
- MariaDB10

をインストールし、phpMyAdminでMariaDB10データベース上にユーザーとデータベースを作成し終わったところから始めます。時間があるときに上記の手順についても書き加えるかもしれません。

###php extensionをオンにする
Web StationのPHP設定から、拡張gdとmysqliにチェックを入れて保存し、全般設定のPHP項目でこのプロファイルを選択しておきます。
![ 2019-03-05 19.51.49.png](https://qiita-image-store.s3.amazonaws.com/0/304379/099927c1-2220-b906-2ae8-27a81175438e.png)

###rep2のセットアップ
ここではパーソナルウェブサイトをオンにして、ユーザーホームフォルダ下のwwwフォルダにセットアップする方法で説明します。ルートフォルダに作成する場合は、作業フォルダ**/volume1/homes/[*user*]/www**を**/volume1/web**に読み替えてください。パーソナルウェブサイトをオンにするためにはApache2.2とPHP5.6の組み合わせが必要となるので、そのバージョンでのセットアップ方法になります。

```console:/volume1/homes/[user]/www
$ git clone git://github.com/open774/p2-php.git
$ cd p2-php
```
```console:/volume1/homes/[user]/www/p2-php
$ curl -O http://getcomposer.org/composer.phar
```

ここまではreadmeに書かれている通りで問題ありませんが、ここから注意が必要です。

この段階ではまだ問題にはなりませんが、今後全てのCLIでのphpコマンドはphp **56**(PHP7.0を使う場合はphp **70**、PHP7.2ならばphp **72**)としてください。

実はSynologyのNASをブラウザから操作するためのアプリケーションDSMは、内部にHTTPサーバーの他、PHPも走っています。そして、コマンドでphpとのみ記載すると、パッケージセンターからインストールしたものではなく、デフォルトのPHPが作動してしまいます。これがic2のセットアップ時に問題となります。


```console:/volume1/homes/[user]/www/p2-php
$ php56 -d detect_unicode=0 composer.phar install
$ chmod 0777 data/* rep2/ic2
```
エラーがないことを確認します

```console:/volume1/homes/[user]/www/p2-php
$ php56 scripts/p2cmd.php check
PHP Version:
  5.6.39: OK
PHP Extensions:
  curl: Not loaded
  dom: OK
  json: OK
  libxml: OK
  mbstring: OK
  pcre: OK
  pdo: OK
  pdo_sqlite: Not loaded
  phar: Not loaded
  session: OK
  spl: OK
  zlib: OK
php.ini directives:
  safe_mode = : OK
  register_globals = : OK
  magic_quotes_gpc = : OK
  mbstring.encoding_translation = 0: OK
  session.auto_start = 0: OK
```
rep2のセットアップは終わりました。これでrep2を使うだけなら問題なく使えるでしょう。

###ImageCache2(ic2)のセットアップ
いよいよic2のセットアップです。readmeを参考にして、自分が作成したmysqlのデータベース、ユーザー、パスワードに基づいてconf/conf_admin_ex.inc.phpとconf/conf_ic2.inc.phpを編集します。ここでは、画像処理エンジンを先ほどチェックした拡張機能'gd'でセットアップします。

```console:/vollume1/homes/[user]/www/p2-php
$ php scripts/ic2.php setup
enabled=3
dsn='mysqli://[user]:[password]@localhost:3307/imagecache'
driver='gd'
                              
  [Exception]                 
  Extension gd is not loaded  
                      
setup [--check-only] [--pg-trgm="..."]
```
あれ？さっきgdにチェック入れたのにgdがロードされません。

ここでまず1回躓きます。先ほど書いた通り、CLIでphpとだけ記載するとDSMのデフォルトのPHPが動作し、このPHPにはgd.soが読み込まれないようになっている(gd.so自体は実装されているがphp.iniに記載されていない)ためです。

ならば、と。

```console:/vollume1/homes/[user]/www/p2-php
$ php56 scripts/ic2.php setup
enabled=3
dsn='mysqli://[user]:[password]@localhost:3307/imagecache'
driver='gd'
                              
  [Exception]                 
  Extension gd is not loaded  
                           
setup [--check-only] [--pg-trgm="..."]
```
えええぇぇぇ…PHP5.6のプロファイルでgdにチェックを入れたのになんで読み込まれないの？

本当にgdは読み込まれていないのか？

```console
$ php56 -r 'phpinfo();' | grep gd
$
```
読み込まれてないし！
なんでだ？

```console
$ cd /volume1/homes/[user]/www/
$ vi phpinfo.php
```
```vim:phpinfo.php
<?php
    phpinfo();
?>
```
これをブラウザから見てみると
![ 2019-03-05 20.55.50.png](https://qiita-image-store.s3.amazonaws.com/0/304379/e3d972c0-17a2-45df-42ff-33006eede3d6.png)
読み込まれてるじゃん！

###結論

```console:/volume1/homes/[user]/web/p2-php
$ php56 -dextension=gd.so scripts/ic2.php setup
enabled=3
dsn='mysqli://[user]:[password]@localhost:3307/imagecache'
driver='gd'
Image Driver: OK
Database: OK
Table 'imgcache' created
Table 'ic2_errors' created
Table 'ic2_blacklist' created
Index 'idx_imgcache_uri' created
Index 'idx_imgcache_time' created
Index 'idx_imgcache_unique' created
Index 'idx_ic2_errors_uri' created
Index 'idx_ic2_blacklist_uri' created
Index 'idx_ic2_blacklist_unique' created
```
パッケージセンターからインストールしたPHPは、CLIから使用する場合、カスタマイズされたphp.ini(user.ini)を読み込まないということでした。なので、gd.soを動作させるためにはコマンドで明示的に打ち込む必要があります。このセットアップを終えてしまえば、あとはHTTPサーバーからのアクセスのみとなるので、特別な作業は必要ありません。

ここにたどり着くのに非常に時間がかかりました。SynologyのNASでgdを含めた拡張を読み込ませるために、modulesフォルダにあるgd.soをコピーしたり、php.iniをコピー&編集したりという方法で解決している場合もありましたが、この件に関しては解決することができませんでした。

一度コマンドで読み込むだけのことなので、この方法が一番良いと思います。お疲れ様でした。

※ちなみにImageMagickを使用する場合は拡張機能を読み込む必要がないので、こんな作業をすることなく使用することができたりします。あくまでgdやimagickを使いたい人向けです。