【Docker + Laravel】WebPushでプッシュ通知機能作成中のエラー 【WebPush gmp extension is not loaded but is required for sending push notifications with payload . You can fix this in your php.ini】

## はじめに
<b>突然ですが、、、、
アプリケーションにメッセージのポップアップ通知機能を実装することになりました。</b>

実装したい機能のイメージはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594063/282c74f2-2ba3-0027-4750-d6de7759f266.png)
(Gigazine様の記事から引用させていただきました。)
画像引用元：[Google ChromeがMac OS Xでネイティブ・プッシュ通知に対応](https://gigazine.net/news/20160407-chrome-native-push-notifications-mac/)

``Google Chrome``使ってると出てくるアレです。
嫌いな人が多いのではないでしょうか。
通知自体を切ってる人が結構多いイメージです。

<b>今回はそんな~~嫌われ者の~~こいつを実装したいので早速方法を調査しました！</b>


## 実装

ネットの海を調べていくと``WebPush``という方法を発見！
``WebPush API``なるものを用いて、ブラウザに対してサーバからプッシュ通知が可能な技術とのこと。

参考記事：[WebPushについて簡単整理](https://dukelab.hatenablog.com/entry/2017/02/13/002548)





.....というわけで以下の記事を参考にプッシュ通知機能の実装を始めました！

https://blog.capilano-fw.com/?p=5404#additional_1

##　開発環境

|環境|バージョン|
|:-----------|------------:|:------------:|
| Mac OS X  | Catalina 10.15.6|  
|Google Chrome | 92
| PHP     | 7.3        
| Laravel     | 6.2      
| Docker       |   20.10.7     

Docker imageは``php:7.3-apache``を使用しました。
[php:7.3-apache](https://hub.docker.com/layers/php/library/php/7.3-apache/images/sha256-d33bcd09b7d07d3028be5e4fd3d4a9cb33ecd3f8b8a8174e01a427636d132421?context=explore)

## 実装中、エラーに遭遇！

記事の内容に従い、5.4の``Service Worker``本体まで作成し、<b>「イベントのプッシュ通知を登録する」</b>をクリックしました。<br>
問題なく<b>登録完了</b>と表示されました。

![スクリーンショット 2021-08-22 0.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594063/41c745ca-9277-e7d1-4c2d-1319734a78c8.png)

<b>続いて、全ユーザーにプッシュ通知を送信するため、テスト用のルーティングを追加しページへアクセスしました。<b>

(以下のコードは今回参考にさせていただいた、[効果的！Laravelでブラウザにプッシュ通知する機能](https://blog.capilano-fw.com/?p=5404#additional_1)の``目次6``から引用させていただきました。)

```web.php

~省略~

Route::get('web_push_test', function(){

    $users = \App\User::all();
    \Notification::send($users, new \App\Notifications\EventAdded());

});

~省略~

```

すると..........

<b>以下のエラーに遭遇!</b>




```
WebPush gmp extension is not loaded but is required for sending push notifications with payload . You can fix this in your php.ini
```

<b>エラー内容を確認するとWebPushを利用するためには、``gmp``というPHPの拡張モジュールのインストールが必要らしい。</b>

一応公式にもインストール方法があったのだが、これだけだとどうも動かない。


```
# apt-get install libgmp-dev
```
[GNU Multiple Precision](https://www.php.net/manual/ja/intro.gmp.php)

その後も別のインストール方法を試したり、PHP.iniの内容を修正してみたもののうまくいかず.....


色々調べてみると<b>GitHub issue</b>に参考にできそうな内容を発見！

<b>コンテナ内で以下のコマンドを実行し、``gmp``をインストールし、``Apache``の再起動でモジュールの有効化ができそう！<b>

```
# apt-get install libgmp-dev
# docker-php-ext-install gmp
# apachectl restart
```

参考記事：[Bookmarks is missing php-gmp ]
(https://github.com/nextcloud/docker/issues/854)

ただ、毎回コンテナにコマンドを打ってインストール&有効化をするのはめんどくさいので、
``Dockerfile``に``gmp``導入のための内容を追記し、``gmp``のインストール&有効化ができるようにしました。


```Dockerfile.
FROM php:7.3-apache

~　省略　~

RUN apt-get update && \
    apt-get -y install libgmp-dev && \ 
    docker-php-ext-install gmp \

~省略~

```
あらかじめDockerfileに記述しておけば、わざわざコンテナ内でコマンド打ったりしなくて済むので便利ですね。

ちなみにここでの<b>``docker-php-ext-install``はPHP標準搭載の拡張パッケージのインストールと有効化ができるようです。</b>

参考記事:[【PHP】peclとは何か？pecl install と docker-php-ext-installの違い]
(https://qiita.com/shizen-shin/items/0d6a9cbeb16047c7d47a#pecl-install%E3%81%A8docker-php-ext-install%E3%81%AE%E9%81%95%E3%81%84)


コンテナ立ち上げ後、
念のために以下のコマンドを実行して、コンテナ内に``gmp``モジュールが追加されているか確認してみると、

```
# php -m | less
```

　⬇︎

```
[PHP Modules]
~省略~
fileinfo
filter
ftp
gmp  ⬅️発見！！！！ 確かにインストールされています。   
hash
iconv
~省略~
```

<b>しっかりできている様子！
さて、次はいよいよ動作確認です！<b>

## 動作確認
<b>``gmp``が無事コンテナ内にインストールできていたので、早速先ほどのテスト用URIへアクセス！<b>

![スクリーンショット 2021-08-22 12.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594063/70c10733-8365-2635-0a05-1c842abf13e4.png)

<b>プッシュ通知が送信され、画面の右上にポップアップメッセージとして表示されました！
機能自体の実装は完了です！ やったね！</b>


## 最後に
思った以上にハマってしまった箇所ではありましたが、最終的に解決できて良かったです！
トライ＆エラーを経て、Dockerへの理解も深まりつつあるので、個人的にはかなり良い経験だったと思います。

<b>ちなみに任意でプッシュ通知を送信できるように、``php artisanコマンド``を作成し、ポップアップメッセージを表示することもできます。</b>

以下の記事を参考にコマンドの作成から実装まで簡単にできます。


https://qiita.com/niisan-tokyo/items/1ecfd31f17ae79283789

ネットの海には有益な情報が沢山溢れていて、本当に助かるなあとしみじみ思いました。
(しかもほとんどが無料で読み放題です。)

私も誰かにとって有益な情報を発信できるように頑張っていきたいと思います。

おしまい