jupyter-php環境を構築してみた

#はじめに
Virtualboxで稼働中のCentOS8に、jupyter-PHP環境を構築してみたので、その備忘録として残しておきます。
※本環境では、jupyter-PHPで使用するPHPは、brewでインストールした最新バージョン「7.4」を使用するものとする。


#前提条件

・OS環境は、Virtualboxで稼働中のCentOS8.1です。以下、OS詳細情報となります。

```php
# cat /etc/centos-release
CentOS Linux release 8.1.1911 (Core)
```

・Virtualboxのネットワーク設定は、「NAT」「ホストオンリーアダプター」で構成。


・OSの初期設定が完了していること。

・jupyter環境が構築済みであること。
※私の環境ではAnacondaの中に含まれている、jupyterを使用。詳細は、[これ](https://qiita.com/yes_dog/items/54e24261331ef7895160)を参照してください。

・Linuxbrewの環境が構築済みであること。
Linuxbrewの環境構築は、[これ](https://qiita.com/yes_dog/items/bd2b61b574199c190c1a)を参照してください。

#手順概要


手順は、以下の順におこなっていきます。

(1)PHP環境を構築
(2)php-zmqをインストール
(3)jupyter-phpをインストール
(4)jupyterにjupyter-phpを認識させる&動作確認


#(1)PHP環境を構築

▼brewコマンドが設定済みの一般ユーザに切り替える

```
# su - qiita
```

▼brewコマンドのアップグレード

```
$ brew upgrade
```

▼brewのバージョン確認

```
$ brew -v
↓以下、出力結果
Homebrew 2.2.6
Homebrew/linuxbrew-core (git revision f9ad8b; last commit 2020-02-28)
```

▼php、zmq、composerをインストール

```
$ brew install php zmq composer
```

▼phpとcomposerのバージョン確認

```
$ php -v && composer -V
↓以下、出力結果
PHP 7.4.3 (cli) (built: Feb 29 2020 13:14:11) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
Composer version 1.9.3 2020-02-04 12:58:49
```


#(2)php-zmqをインストール

▼作業ディレクトリ「/var/tmp/php」を作成&移動

```
$ mkdir /var/tmp/php && cd /var/tmp/php && pwd
```

▼php-zmqをダウンロード

```
$ git clone http://github.com/mkoppanen/php-zmq.git
```

▼php-zmqに移動

```
$ cd php-zmq && pwd
```

▼PHPに拡張モジュールを追加(configureの作成)

```
$ phpize
```

> phpizeとは
>拡張モジュールをビルドする低レベルなビルドツール。
>autoconfやautomake m4等のビルドツールが別途必要になる。
>これを使用することにより、PHPをソースから再コンパイルすることなく拡張モジュールをビルドすることができる。
>参考URL：https://www.weblio.jp/content/phpize

▼スクリプトファイルを実行

```
$ ./configure
```

▼コンパイルを実行

```
$ make
```

▼コンパイルされたphp-zmqをインストール

```
$ make install
↓以下が出力がされればOK
Installing shared extensions:     /home/linuxbrew/.linuxbrew/Cellar/php/7.4.3/pecl/20190902/
```

※「configure」, 「make」, 「make install」については、わかりやすくまとめてくださっている記事があるので、詳しくはこれを参照してください。
>参考URL：[configure, make, make install とは何か](https://qiita.com/chihiro/items/f270744d7e09c58a50a5)


▼php.iniにzmqを定義

```/home/linuxbrew/.linuxbrew/etc/php/7.4/php.ini
extension=zmq.so
```

▼phpが「php-zmq」を認識できているかを確認

```
$ php -i | grep zmq
↓以下、出力結果
zmq
libzmq version => 4.3.2
PWD => /var/tmp/php/php-zmq
$_SERVER['PWD'] => /var/tmp/php/php-zmq
```

※上記出力のように「zmq」「libzmq version」が出力されていればOK
※出力されない場合は、phpがzmqを認識していないので次項の「jupyter-php」のインストールに失敗する。



#(3)jupyter-phpをインストール

▼「/var/tmp/php」に移動

```
$ cd /var/tmp/php && pwd
```

▼「jupyter-php-installer.phar」をダウンロードする

```
$ wget https://litipk.github.io/Jupyter-PHP-Installer/dist/jupyter-php-installer.phar
```

※jupyter-phpは、ここからダウンロードする。
https://litipk.github.io/Jupyter-PHP-Installer/

▼jupyter-phpをインストール

```
$ php jupyter-php-installer.phar install -vvv
```

※「-vvv」をつけることで、エラー情報などを詳細に表示してくれる。
※「The Jupyter-PHP kernel has been successfully installed.」が出力されればインストール完了


#(4)jupyterにjupyter-phpを認識させる&動作確認

▼rootユーザに切り替える

```
# exit
```


▼jupyterが認識しているカーネルの一覧を出力する

```
# jupyter kernelspec list
↓以下、出力結果
Available kernels:
  python3    /root/.pyenv/versions/anaconda3-5.3.1/share/jupyter/kernels/python3
```

※私の環境では、「jupyter-php」をインストールしただけでは、jupyter側で認識はされなかった。


▼先ほどインストールしたjupyter-phpを検索する

```
# find / -name jupyter-php | grep kernels
↓以下が、私の環境のjupyter-phpがあるディレクトリ階層
/home/qiita/.local/share/jupyter/kernels/jupyter-php
```

※トップディレクトリを指定した検索は、ディレクトリ構造が複雑な場合、サーバに負荷がかかるので自己責任で！！

▼jupyter-phpのディレクトリ階層を確認

```
# ls -la /home/qiita/.local/share/jupyter/kernels/jupyter-php/
合計 4
drwxr-xr-x 2 qiita qiita  25  2月 29 13:58 .
drwxr-xr-x 3 qiita qiita  25  2月 29 13:58 ..
-rw-rw-r-- 1 qiita qiita 165  2月 29 13:58 kernel.json
```

※「jupyter」で、認識するために必要な「kernel.json」ファイルがあればOK
※次の手順で、jupyterが各カーネルを認識しているディレクトリ階層にファイルをセットする。(シンボリックリンクで)

▼「jupyter」に「jupyter-php」を認識させるためにシンボリックリンクをはる

```
# ln -s /home/qiita/.local/share/jupyter/kernels/jupyter-php /root/.pyenv/versions/anaconda3-5.3.1/share/jupyter/kernels/
```

▼シンボリックリンクの実行後の確認

```
# ls -la /root/.pyenv/versions/anaconda3-5.3.1/share/jupyter/kernels/
↓以下、出力結果
合計 0
drwxr-xr-x 3 root root 40  2月 29 14:12 .
drwxr-xr-x 5 root root 52  2月 23 11:13 ..
lrwxrwxrwx 1 root root 52  2月 29 14:12 jupyter-php -> /home/qiita/.local/share/jupyter/kernels/jupyter-php
drwxr-xr-x 2 root root 69  2月 23 11:13 python3
```

▼jupyterが認識しているカーネルの一覧を出力する

```
# jupyter kernelspec list
↓以下、出力結果
Available kernels:
  jupyter-php    /root/.pyenv/versions/anaconda3-5.3.1/share/jupyter/kernels/jupyter-php
  python3        /root/.pyenv/versions/anaconda3-5.3.1/share/jupyter/kernels/python3
```
※「jupyter」に「jupyter-php」を認識させられればOK



▼jupyter起動後、ブラウザで表示される名称を変更

```/home/qiita/.local/share/jupyter/kernels/jupyter-php/kernel.json
"display_name":"PHP"
↓
"display_name":"PHP74"
```

※ブラウザで表示される名称がPHPだけでは味気ないので、バージョン情報付きに修正。

▼jupyter notebookを起動

```
# jupyter notebook --allow-root
```
![02-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/dac65057-883d-f143-d3f1-bbdd11d2f62a.png)



▼jupyter labを起動

```
# jupyter lab --allow-root
```

![01-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/d95b93c3-9cd7-5b05-7813-3d4982c67620.png)



#最後に

jupyterを起動後、PHPが認識されていれば完了です。
jupyterでは、PHP以外にもほかの言語も追加できるみたいなので興味のある方はやってみてください。
終わりです( *´艸｀)


#参考URL一覧
・[OSX El CapitanにJupyterLabをインストールする](https://qiita.com/maccotsan/items/80c0579e9bb8845808ea)
・[configure, make, make install とは何か](https://qiita.com/chihiro/items/f270744d7e09c58a50a5)
・[Weblio 辞書 > コンピュータ > PHP用語 > phpizeの意味・解説 ](https://www.weblio.jp/content/phpize)
・[PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20131226-zts/zmq.so' - /usr/lib/php5/20131226-zts/zmq.so #147](https://github.com/zeromq/php-zmq/issues/147)
・[PHPでメッセージ送受信(zeromq)](https://qiita.com/ytake/items/884f38b1dcbc9b936f68)